ð ãã®èšäºã¯ Zenn ã«æçš¿ããå 容ã®ã¢ãŒã«ã€ãã§ãã
ã¯ããã«
C++11 ã§ãå³èŸºå€åç
§ïŒrvalue referenceïŒããå°å
¥ãããããšã§ãC++ ã®å€åé¡ïŒvalue categoryïŒã¯å€§ããé²åããŸããã
C++98 ã§ã¯ã巊蟺å€ïŒlvalueïŒããšãå³èŸºå€ïŒrvalueïŒãã®äºåæ³ãããããŸããã§ããããC++11 ã§ã¯ããã«çްããåé¡ãããŸãïŒ
C++11ã§å°å
¥ãããæ°ããæŠå¿µã§ãã
xvalueïŒæéåãå³èŸºå€ïŒ ãš prvalueïŒçŽç²å³èŸºå€ïŒ ãã
ãã®ç« ã®äžæ žçãªé²åãã€ã³ãã§ãã
C++98 æä»£ã®ãåçŽãªäžçã
C++98 ã®æä»£ã¯ãšãŠãã·ã³ãã«ã§ããã
å·ŠèŸºå€ (lvalue) ïŒä»£å ¥ã®å·ŠåŽã«çœ®ãããã®ãæ°žç¶çãªã¢ãã¬ã¹ãæã€ã
äŸïŒa,*ptr,array[i]å³èŸºå€ (rvalue) ïŒäžæçãªå€ãããã«ç Žæ£ãããã
äŸïŒa + 5,42,func()
ã«ãŒã«ãçŽæçã§ããïŒ
int a = 3;
&a; // OK 巊蟺å€ã¯ã¢ãã¬ã¹ãåãã
&(a + 5); // ãšã©ãŒïŒå³èŸºå€ã¯ã¢ãã¬ã¹ãåããªã
ããããã®åçŽãããæ§èœã®å£ ã«ãªã£ãŠããŸããã
åé¡ïŒç¡é§ãªã³ããŒãå€ããã
std::vector<int> create_vector() {
std::vector<int> temp;
temp.push_back(1);
temp.push_back(2);
temp.push_back(3);
return temp; // ããã§äœãèµ·ããïŒ
}
std::vector<int> v = create_vector();
C++98 ã®ä»æ§ã§ã¯ return temp; ã§ ã³ããŒãçºç ããŸããtemp ã®ããŒãã¡ã¢ãªããŸãããšè€è£œããåŒã³åºãåŽã«è¿ãã®ã§ãã
RVOïŒReturn Value OptimizationïŒ ã«ããæé©åã§ããå ŽåããããŸããã
ãããŸã§ã³ã³ãã€ã©äŸåã§ãä¿èšŒã¯ãããŸããã
å§å¡äŒã®çºæ³ïŒãã³ããŒããã«âçãâããšã¯ã§ããªããïŒã
2000幎代åæãC++æšæºåå§å¡äŒãèããŸããã
ãã©ãããã®äžæãªããžã§ã¯ãã¯ããæ¶ããããªãè³æºãã³ããŒããçããªããïŒ ã
ã€ãŸãããã§ãïŒ
std::vector<int> v = create_vector();
ãã®ãšããcreate_vector() ã®æ»ãå€ããããããæ»ã¬ãããšãèšèªã¬ãã«ã§èªèã§ããã°ã
ããŒãã®æææš©ããã®ãŸãŸ v ã«ç§»å ãããããšãã§ããŸãã
ããããã ãŒãã»ãã³ãã£ã¯ã¹ïŒmove semanticsïŒ ãã®èªçã§ãã
ã§ããã©ã®ãªããžã§ã¯ãããçãããã®ïŒ
åçŽã«ãå³èŸºå€ãªãçããããšãããšããããªåé¡ãåºãŸãã
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = v1; // v1 ã¯å³èŸºå€ïŒâéãïŒ
v1 㯠ååãæã€ ãªããžã§ã¯ããã€ãŸã巊蟺å€ã
ããŸã 䜿ããããããªããã®ã§ãè³æºãçãã§ã¯ãããŸããã
ã§ã¯ã©ããããïŒ
std::move ã®ç»å Žãšãæéåãå³èŸºå€ (xvalue)ã
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = std::move(v1);
std::move(v1) ã¯ã巊蟺å€ããçãã§ãããç¶æ
ãã«å€æ ããŸãã
æ§æçã«ã¯å·ŠèŸºå€ïŒååãæã€ïŒ
ãããæå³çã«ã¯ããã䜿ããªãã
ãã®ãèŠãç®ã¯å·ŠèŸºå€ãæå³ã¯å³èŸºå€ ããªååšãããã
C++11 æå€§ã®é©æ°ââ xvalueïŒæéåãå³èŸºå€ïŒ ã§ãã
5åé¡ã®æŽç
| çš®é¡ | åç§° | äŸ | ç¹åŸŽ |
|---|---|---|---|
| lvalue | å·ŠèŸºå€ | a, *ptr, obj.member | ååã»ã¢ãã¬ã¹ãããçããªã |
| prvalue | çŽç²å³èŸºå€ | 42, a + b, create_vector() | äžæçãã¢ãã¬ã¹ãªããçãã |
| xvalue | æéåãå³èŸºå€ | std::move(v) | ã¢ãã¬ã¹ãããè³æºãç§»åã§ãã |
| glvalue | äžè¬åå·ŠèŸºå€ | lvalue + xvalue ã®ç·ç§° | ã¢ãã¬ã¹ãæã€åŒ |
| rvalue | å³èŸºå€ | prvalue + xvalue ã®ç·ç§° | è³æºãç§»åã§ããåŒ |
ã€ãŸãå®äœãšããŠã¯3ã€ïŒ
lvalue / prvalue / xvalue
æ®ã2ã€ã¯åé¡äžã®éåã«ãããŸããã
ãªããããŸã§è€éã«ããã®ãïŒ
çç±ã¯ã²ãšã€ã
âç§»åå¯èœãã€èå¥å¯èœâ ãªãªããžã§ã¯ããæ£ãã衚çŸããããã
äŸãèŠãŠã¿ãŸãããïŒ
std::vector<int> create_vector() {
std::vector<int> temp = {1, 2, 3};
return temp;
}
auto&& ref = create_vector();
std::cout << ref.size() << std::endl;
create_vector() ã®æ»ãå€ã¯äžèŠå³èŸºå€ïŒrvalueïŒã§ãããref ã«æçžãããŠå¯¿åœãå»¶é·ãããŠããŸãã
ããã¯ãã¢ãã¬ã¹ãããããã€ç§»åå¯èœãã
ããªãã¡ xvalueïŒæéåãå³èŸºå€ïŒ ã§ãã
ããã«ããå¯èœã«ãªã£ãããš
ç§»åã³ã³ã¹ãã©ã¯ã¿ / ç§»åä»£å ¥
std::vector<int> v2 = std::move(v1); // move ctor
v2 = std::move(v3); // move assignment
å€ã®çš®é¡ã«ãã£ãŠãèªåçã«ãã³ããŒãããã ãŒãããéžã°ããŸãã
å®å šè»¢éïŒPerfect ForwardingïŒ
template<typename T>
void wrapper(T&& arg) {
real_function(std::forward<T>(arg));
}
ãã® T&& ã¯ãå³èŸºå€åç
§ãã§ã¯ãªãã転éåç
§ïŒforwarding referenceïŒãã
巊蟺å€ãæž¡ã â
Tã¯int&ãargã¯å·ŠèŸºå€å³èŸºå€ãæž¡ã â
Tã¯intãarg㯠xvalue
std::forward ããå
ã®å€ã«ããŽãªãä¿æããŠè»¢éããŸãã
ããã xvalue ãååšãããããã§ãã
ä»èšèªãšã®æ¯èŒ
| èšèª | 解決ã¢ãããŒã | ç¹åŸŽ |
|---|---|---|
| Rust | æææš©ã·ã¹ãã | æææš©ãèªåç§»åãstd::move äžèŠ |
| Java/C# | åç §åïŒGC | ã³ããŒãã ãŒããäžèŠãæ§èœã³ã¹ããã |
| Python | å šãŠåç §æž¡ã | ã³ããŒæŠå¿µãªããå¯äœçšãªã¹ã¯ãã |
| C++ | å€ãšè³æºã®å¶åŸ¡ãéçºè ã«å§ãã | ãŒããªãŒããŒããããè¿œæ± |
C++ ã¯ãå
šãŠèªåã§ç®¡çããããšããå²åŠã貫ããŠããŸãã
ãããé£ããã§ããã匷ãã§ããããŸãã
ãŸãšãïŒèŠããŠãããã宿Šãã€ã³ã
颿°ããããŒã«ã«ãè¿ããšãã¯ã³ããŒãããªã ïŒC++11以éèªåã§ã ãŒãïŒ
è³æºãç§»ããããšãã¯
std::moveãã³ãã¬ãŒãåŒæ°ã®è»¢éã«ã¯
std::forwardlvalue = ååãæã€
prvalue = äžæçãªå€
xvalue = â䜿ãçµãã£ãâ 巊蟺å€
çµè«
C++11 ã®å€ã«ããŽãªäœç³»ã¯äžèŠè€éã§ããã
ãããçè§£ããã°ãC++ã®çŸä»£çãªåã·ã¹ãã ã®æ¬è³ªãã«å°éããŸãã
ãC++ ã¯ãã·ã³ãã«ãªåé¡ãè€éã«ããæãäžæãèšèªã
ââãããããã®è€éãã®è£ã«ã¯âããŒããŠã§ã¢ã®éçãåŒãåºãåâãããã
ããã¯åªãã§ãããåæã«èªãã§ããããŸãã