std::string ã®æ£ä½ï¼gcc-4.4.3ï¼ã¨ç´°ãã話
# ç°å¢ä¾åãªå 容ãªä¸ï¼ç¡é§ã«ç´°ãã話ãªã®ã§ï¼ããããããã¨ããããããã¼ããããã«æµãã¡ãã£ã¦ãã ããï¼
ï¼è¿½è¨ 2011-01-11ï¼æ°ããè¦æ ¼ã§ã¯ std::string ã® Copy on Writeï¼CoW: æ¸ãè¾¼ã¿æã«è¤è£½ï¼ãå®è³ªç¦æ¢ã«ãªãã¨ã®ãã¨ã§ãï¼å¾ï¼gcc 4.5 ã®æç¹ã§ CoW ã¯ããã¦ãã¾ãã¿ããã§ããï¼ããããªæ代ããã£ãããããã«è»½ãæµãã¡ãã£ã¦ãã ããï¼id:gintenlabo ããï¼ã³ã¡ã³ããããã¨ããããã¾ãï¼
ï¼è¿½è¨ã®ç¶ãï¼å人çã«ã¯ï¼std::string ã® CoW åä½ã¯æåãåããã«ãããªãã®ã§æ¢ããæ¹ã«è³æã§ãï¼ã§ãï¼std::vector<:string> ãªãããæ¡å¼µããã¨ãã¯ã©ãããã®ããªâ¦ï¼ã³ãã¼ãã¦ãã¾ãã®ãï¼swap() ã使ãããã«ããã®ãâ¦ï¼
ï¼ããã«è¿½è¨ 2011-01-11ï¼ããã£ã¨ï¼ã ã¼ãã³ã³ã¹ãã©ã¯ã¿ã«ã ã¼ãä»£å ¥æ¼ç®åãªãã¦ãã®ãâ¦ï¼
Google Code Archive - Long-term storage for Google Code Project Hosting. ãå®è£ ãã¦ãã¦ï¼std::string ã®ã¡ã¢ãªæ¶è²»ã¯è¨ç®ãé£ãããªã¼ã¨æãï¼å°ã調ã¹ã¦ã¿ã¾ããï¼å¾ã¯ï¼ãã®çµæããèããå 容ã«ãªã£ã¦ãã¾ãï¼
std::string ã®æ£ä½ã«ã¤ãã¦
çµè«ããå ¥ãã¾ãï¼std::string ã®æ£ä½ã¯ãã¤ã³ã¿ã§ï¼åç §å ã®ãªãã¸ã§ã¯ããåç §ã«ã¦ã³ã¿ãæã£ã¦ãã¾ããï¼std::tr1::shared_ptr ã¿ãããªæãã§ãï¼
- ããã£ã¨è©³ããå 容
åç §ã«ã¦ã³ããæã£ã¦ããããã§ãããï¼std::string ã®ã³ãã¼ã»ä»£å ¥ã«ã¤ãã¦ã¯ï¼ãã¤ã³ã¿ã®ã³ãã¼ã»ä»£å ¥ã¨åç §ã«ã¦ã³ãã®æä½ãããããããªããã¨ã«ãªãã¾ãï¼ããã¦ï¼å ±æããã¦ããæååã«å¯¾ãã¦ç·¨éãçºçããããªãæä½ããããªãã¨ï¼æååã®è¤è£½ãä½æãããããã«ãªã£ã¦ãã¾ãï¼
std::string str = "abc"; // ãã®æç¹ã§ã¯ï¼æååã®è¤è£½ã¯ä½æããã¾ããï¼ std::string str2 = str; // std::string::operator[]() ã¯ç·¨éå¯è½ï¼é constï¼ãªåç §ãè¿ãã®ã§ï¼ // ãã®æç¹ã§æååã®è¤è£½ãä½æããããã¨ã«ãªãã¾ãï¼ char c = str[0];
append() ã operator+=() ãªããã¯ç·¨éããã®ãæããã§åãããããã®ã§ããï¼ä¸è¿°ã® operator[]() ã begin(), end() ãªã©ã¯æ²¹æãã¦ããã¨ç·¨éãçºçããããªãæä½ã§ãããã¨ãå¿ãã¦ãã¾ããã¡ã§ãï¼ã¡ãã£ã¨ããç½ ããâ¦ï¼ã¨ããããã§ï¼const ã¯å¤§äºã§ãï¼
ï¼è¿½è¨ 2011-01-11ï¼CoW ããªããªãã®ã§ããã°ï¼ã³ãã¼ã®æ®µéã§æååãè¤è£½ãããã®ã§ï¼ãããªãã¨ãæ°ã«ããå¿ è¦ã¯ãªããªãããã§ãï¼
std::string ãåãåãé¢æ°ã«ã¤ãã¦
åºæ¬çã«ï¼å¼æ°ã®å㯠const std::string & ã«ããã®ã妥å½ã ã¨æãã¾ãï¼ã§ãï¼ãããããã¨ï¼åç §ã«ããªãæ¹ãè¯ããã¨ãããã®ããããã¾ããï¼
# ããããã¯ãã¾ããï¼æ¢ãã¦ãããæ¹ãè¯ãã¨æãã¾ãï¼
std::string ã std::tr1::shared_ptr ã®ãããªåå¨ã§ãããªãã°ï¼æ®éã« std::string ã§åã渡ãããããªã£ã¦ãï¼ãªã¼ãã¼ãããã¯ã»ã¨ãã©ç¡è¦ã§ãããã§ãï¼ãã ãï¼è¿éãªãã¨ãããã¨æååã®è¤è£½ãä½æããã¦ãã¾ãã¨ããç½ ãããã®ã§ï¼const std::string ã«ãã¦ãããæ¹ãããããã§ãï¼å°ãã°ããè¡æ£èãã®ã¯æ°ã«ãããã¾ããâ¦ï¼
void Func(const std::string &str) { str[0]; // å½ç¶ï¼å¤§ä¸å¤«ã§ãï¼ } void Func1(std::string str) { str[0]; // ããã£ã¨ï¼æãã¬ã¨ããã§æéãããã£ã¦ããã®ããâ¦ï¼ } void Func2(const std::string str) { str[0]; // ãã¡ãã¯å¤§ä¸å¤«ã§ãï¼ }
ï¼è¿½è¨ 2011-01-11ï¼std::string ã® CoW åä½ããªããªãã¨ä¸ã® 2 ã¤ã¯æååã®è¤è£½ãã¤ãã£ã¦ãã¾ãã¾ãï¼ãã£ã±ãåç §ã使ãã¾ãããï¼
std::string ã®è¤è£½ã«ã¤ãã¦
ã¨ãã«ï¼std::string ããã®ã¾ã¾è¤è£½ããããï¼std::string::c_str(), std::string::length() ã使ã£ã¦æ示çã«æååã®è¤è£½ãä½æããæ¹ãè¯ãå ´åãããã¾ãï¼ã¨ããããï¼äºç¨®é¡ã®è¤è£½æ¹æ³ãæ¯ã¹ã¦ã¿ã¾ãããï¼
std::string str; // æåå㯠str, str2 ã«ããå ±æãããç¶æ ã«ãªãã¾ãï¼ std::string str2(str); // æååã®è¤è£½ãæ示çã«ä½æãï¼str, str3 ãç¬ç«ããåå¨ã«ãã¾ãï¼ std::string str3(str.c_str(), str.length());
ããããå¾è ã使ãã¹ãã¨ãã¨ã¯ï¼marisa::Trie::predict() ã®ãããªé¢æ°ã®å ´åã§ãï¼ããªã¯ã¡ï¼std::string ã«ç´°ããå¤æ´ï¼operator+=() ã«ãã延é·ã¨ resize() ã«ããç縮ï¼ãç¹°ãè¿ãï¼ãã®éä¸çµéã std::vector<std::string> ã«æ ¼ç´ãã¦ãããããªã¨ãã§ãï¼ãªãã¨ãããï¼ãããç¨ãªã±ã¼ã¹ã§ãï¼
以ä¸ã«ä¾ãç¨æãã¦ã¿ã¾ããï¼
void FuncX(std::vector<std::string> *keys) { // æåå "0123456789" ãä½æããã¾ãï¼ std::string str = "0123456789"; // "012" ã«ç縮ãã¾ãï¼ãã ãï¼å²ãå½ã¦ããã¦ããé åã¯ãã®ã¾ã¾ã§ãï¼ str.resize(3); // 1. è¤è£½ã«ãã£ã¦ str ã¯å ±æç¶æ ã«ãªãã¾ãï¼ãã®ã¨ãï¼keys ã«æ ¼ç´ããã // æååã«ã¯ï¼"0123456789" ãæ ¼ç´ã§ããã ãã®é åãå²ãå½ã¦ããã¦ãã¾ãï¼ // 次㫠str ãç·¨éããã¿ã¤ãã³ã°ã§ï¼str ç¨ã«æ°ããªé åãå²ãå½ã¦ããã¾ãï¼ keys->push_back(str); // 2. ãã¡ã㯠"012" ç¨ã«é åã確ä¿ãç´ã㦠keys ã«æ ¼ç´ãã¾ãï¼ // str ã«ã¯å½±é¿ãçºçãã¾ããï¼ // ï¼è¿½è¨ 2011-01-11ï¼std::string() ãæãã¦ããã®ã§è¿½å ãã¾ããï¼ keys->push_back(std::string(str.c_str(), str.length())); ... }
ç¶ã㦠str ãç·¨éãã¦ããå ´åï¼2. ã®æ¹ãé©åã§ãï¼ãã®çç±ã¯ï¼ç¡é§ã«å¤§ããªé åãå²ãå½ã¦ãæååã keys ã«æ ¼ç´ããªããã¨ã¨ï¼str ã«å²ãå½ã¦ããã¦ããé åãçãããªããã¨ã§ãï¼1 ã¤ç®ã®çç±ã¯ï¼ã¡ã¢ãªæ¶è²»ãæãããã¨ã«ã¤ãªããï¼2 ã¤ç®ã®çç±ã¯ï¼ã¡ã¢ãªã®ç¢ºä¿ã»è§£æ¾ã«ãããªã¼ãã¼ããããæãããã¨ã«ã¤ãªããã¾ãï¼
marisa::Trie::predict() ã®å ´åï¼2. ã®æ¹æ³ã«åãæ¿ãããã¨ã§ï¼å¦çæéãå¹³å 4% ãããçãã§ãã¾ããï¼ã¨ã¯ããï¼ãããããã¥ã¼ãã³ã°ã«ã¯æãåºããªãã®ãç¡é£ã ã¨æãã¾ãï¼èªèº«ã®ç°å¢ã§ã¯æ¹åããã¦ãï¼ä»ã®ç°å¢ã§ã¯æªåãããã¾ããããâ¦ï¼
ï¼è¿½è¨ 2011-01-11ï¼å
é ã«ãæ¸ãã¾ãããï¼std::string ã® CoW ã¯ãªããªããããã§ãï¼ãããªã£ã¦ããã¨ï¼ä¸è¨ã®éãã¯ãªããªãã¨äºæ³ããã¾ãï¼
ï¼è¿½è¨ 2011-01-11ï¼ãã¼ã£ã¨ï¼å¾è ã¯ï¼push_back() ã®åã«ã³ã³ã¹ãã©ã¯ã¿ã§ãªãã¸ã§ã¯ããä½æãã¦ï¼ããã« push_back() ã®ä¸ã§ã³ãã¼ã³ã³ã¹ãã©ã¯ã¿ãâ¦ã¨ãããã¨ã§äºéã«ãªãã¾ãï¼str.c_str() ã ãã§æ¸¡ã㨠NULL æåãå ¥ãã¨å°ããï¼çµå±ã®ã¨ããï¼ãã®ã¾ã¾æ¸¡ãã®ï¼åè ï¼ã妥å½ã§ããããï¼