ã¢ãã³ç¬¬2ç« ïŒãC++11/14ãå³èŸºå€åç
§ãšã ãŒãã»ãã³ãã£ã¯ã¹ïŒãŒãã³ããŒé©åœïŒ
å³èŸºå€åç
§ïŒT&&ïŒãstd::moveãRule of Five ã«ãããŒãã³ããŒæœè±¡å
Cèšèªãã¬ã¬ã·ãŒãªC++03ã§ã¯ã倧ããªãªããžã§ã¯ããé
åã颿°ããè¿ãããã³ã¬ã¯ã·ã§ã³ã«è¿œå ããéããã¹ãŠã®ããŒã¿ãè€è£œããããã£ãŒãã³ããŒããçºçããå€å€§ãªCPUæéãšã¡ã¢ãªã浪費ããŠããŸãããC++11æå€§ã®é©åœã§ãããã ãŒãã»ãã³ãã£ã¯ã¹ïŒå³èŸºå€åç
§ãšstd::moveïŒããåŠçãã€ã³ã©ã€ã³ã§èšè¿°ã§ãããã©ã ãåŒãããããŠåæšè«ãautoãã«ãã£ãŠãå®å
šæ§ã1ããªãç ç²ã«ããæ¥µéã®å®è¡é床ãæã«å
¥ããã¢ãã³C++ã®ææ³ãç¿åŸããŸãã
M2.1 ãã£ãŒãã³ããŒã®æ²åãšå³èŸºå€åç
§ïŒT&&ïŒã®é©åœ
ãæšãŠãäºå®ã®å·šå€§ããŒã¿ããããããå
šä»¶ã³ããŒããŠããå
ã®ããŒã¿ãç Žæ£ããŠããŸãããïŒã ãŒãã»ãã³ãã£ã¯ã¹ããªãC++11以éã®æšæºã©ã€ãã©ãªãæ ¹æ¬ããé«éåããã®ãããã®ç©çæ§é ãè§£ãæãããŸãã
ð§ ãã³ã®ã³å
茩
ãã³å
çïŒã¹ããŒãžäžã®åŒŸäžžãæµããŒã¿ããŸãšãã std::vector ãå¥ã®ç®¡çã¯ã©ã¹ã«æž¡ãããšããããã²ãŒã ãäžç¬ã«ã¯ã€ããã§ãããããã¡ã€ã©ãèŠãããã¡ã¢ãªã®ã³ããŒåŠçã«æéãããã£ãŠããŸããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ã¬ããïŒãããããå€å
žC++ã®å®¿çŸããã£ãŒãã³ããŒïŒæ·±å±€è€è£œïŒã®æ²åãããïŒvector ã®äžã«æ°çŸåã®èŠçŽ ããããšããã¬ã¬ã·ãŒãªã³ããŒä»£å
¥ `a = b;` ãè¡ããšãããŒãé åãæ°ãã malloc ãçŽããå
šèŠçŽ ã1ã€ãã€æçŽã«ã³ããŒããŠãã£ãã®ããã
ð§ ãã³ã®ã³å
茩
ã§ãå
çãå
ã® `b` ã¯ä»£å
¥ããçŽåŸã«é¢æ°ãæããŠæ¶ããäžæãªããžã§ã¯ããªãã§ãïŒæ¶ãããã€ã®äžèº«ããã¡ãã¡ã³ããŒããã®ããã¡ããã¡ãç¡é§ãããªãã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
éãã®ãããã³ã®ã³ïŒãŸãã«ãã®ãã©ããæ¶ããäžæãªããžã§ã¯ãïŒå³èŸºå€ïŒããããã¡ã¢ãªã®æææš©ãã€ã³ã¿ã ãããã¥ããšå¥ªãåãä»çµã¿ããããã ãŒãã»ãã³ãã£ã¯ã¹ïŒMove SemanticsïŒãããïŒC++11ã§äžçãå€ããå€§çºæãªããããïŒ
M2.2 std::move ã®æ£ããäœ¿ãæ¹ãšãæãæ®»ïŒMoved-fromïŒãã®èŠåŸ
`std::move()` ã¯å®éã«ã¯ãäœãåãããªããïŒïŒstd::move ã®æ£äœã§ãããå³èŸºå€ãã£ã¹ããã®ä»çµã¿ãšãã ãŒããããåŸã®å€æ°ãè§Šã£ãŠã¯ãããªãéåãåŠã³ãŸãã
M2.3 ã©ã ãåŒïŒç¡å颿°ïŒïŒé¢æ°ã®å³åžã€ã³ã©ã€ã³å®çŸ©
ãæ»ãã æµãäžæ¬åé€ãããã®ã«ããã¡ãã¡å€éšã«é¢æ°ãã€ã³ã¿ããã¡ã³ã¯ã¿ã¯ã©ã¹ãæžããŠããŸãããïŒã¢ãã³C++ã®ã©ã ãåŒ `[...] (...) { ... }` ã§ã³ãŒãã®å±ææ§ãšå¯èªæ§ã極éãŸã§é«ããŸãã
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. ã¢ãã³C++ã«ãããŠãã ãŒãã»ãã³ãã£ã¯ã¹ïŒstd::moveïŒãããã£ãŒãã³ããŒããå§åçã«é«éã§ããæ ¹æ¬çãªçç±ã¯äœã§ããïŒ
- 1. CPUã®ãã«ãã³ã¢ããã¹ãŠäœ¿ã£ãŠäžŠåã«ããŒã¿ãã³ããŒãããã
- 2. ããŒãäžã®å®äœããŒã¿ã1ãã€ããè€è£œãããå
éšã®ãã€ã³ã¿çªå°ãããæ¿ããïŒä»ãæ¿ããïŒã ãã§å®äºãããã
- 3. OSã®ä»®æ³ã¡ã¢ãªå§çž®æ©èœã匷å¶èµ·åãããã
- 4. ã³ã³ãã€ã©ãèªåçã«ã¢ã»ã³ãã©ã® goto æã«å€æãããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒããŒãäžã®å®äœããŒã¿ã1ãã€ããè€è£œãããå
éšã®ãã€ã³ã¿çªå°ãããæ¿ããïŒä»ãæ¿ããïŒã ãã§å®äºãããã
æ£è§£ã¯ãããŒãäžã®å®äœããŒã¿ã1ãã€ããè€è£œãããå
éšã®ãã€ã³ã¿çªå°ãããæ¿ããïŒä»ãæ¿ããïŒã ãã§å®äºãããããã§ããæ¶æ»
äºå®ã®äžæãªããžã§ã¯ããããã€ã³ã¿ãè²ãåããããšã§ãã©ãã»ã©å·šå€§ãªé
åãæååã§ãã£ãŠãO(1)ã®ç¬æã«æææš©ãç§»åã§ããŸãã
Q2. `std::move(x)` ãå®è¡ããçŽåŸãå
ã®å€æ° `x` ã®ç¶æ
ã«ã€ããŠæ£ãã説æã¯ã©ãã§ããïŒ
- 1. ã¡ã¢ãªããå®å
šã«æ¶æ»
ãã倿°ã®å®£èšèªäœãç¡å¹ã«ãªã
- 2. æå¹ã ãæªèŠå®ïŒValid but unspecifiedïŒãªç¶æ
ïŒç©ºã®ãã€ã³ã¿ã空ã®é
åïŒã«ãªããå代å
¥ãããŸã§ã¯å®å
šãªå©çšãä¿èšŒãããªã
- 3. 以åãšå
šãåãå€ããã®ãŸãŸä¿æãããŠãã
- 4. å³åº§ã«OSã®ã¢ã¯ã»ã¹éåïŒSegmentation FaultïŒãçºçãã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒæå¹ã ãæªèŠå®ïŒValid but unspecifiedïŒãªç¶æ
ïŒç©ºã®ãã€ã³ã¿ã空ã®é
åïŒã«ãªããå代å
¥ãããŸã§ã¯å®å
šãªå©çšãä¿èšŒãããªã
æ£è§£ã¯ãæå¹ã ãæªèŠå®ïŒValid but unspecifiedïŒãªç¶æ
ã«ãªããå代å
¥ãããŸã§ã¯å®å
šãªå©çšãä¿èšŒãããªããã§ãããªãœãŒã¹ãæ°ããææè
ãžåŒãæž¡ããããããå
ã®å€æ°ã¯ã空ã£ãœã®æãæ®»ãã«ãªããŸãã
Q3. C++ã®ã©ã ãåŒ `[=](int a) { return a + bonus; }` ã«ãããŠãå
é ã® `[=]`ïŒãã£ããã£ãªã¹ãïŒã¯äœãæå³ããŠããŸããïŒ
- 1. å€åŽã®ããŒã«ã«å€æ°ããã¹ãŠãã³ããŒïŒå€æž¡ãïŒãããŠã©ã ãåŒå
éšã§å©çšå¯èœã«ãã
- 2. å€åŽã®ããŒã«ã«å€æ°ããã¹ãŠãåç
§ïŒãã€ã³ã¿æž¡ãïŒããšããŠå©çšå¯èœã«ãã
- 3. åŒæ° a ãš bonus ãçãããã©ãããæ¯èŒãã
- 4. ã©ã ãåŒã®æ»ãå€ã匷å¶çã« void ã«ãã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒå€åŽã®ããŒã«ã«å€æ°ããã¹ãŠãã³ããŒïŒå€æž¡ãïŒãããŠã©ã ãåŒå
éšã§å©çšå¯èœã«ãã
æ£è§£ã¯ãå€åŽã®ããŒã«ã«å€æ°ããã¹ãŠã³ããŒïŒå€æž¡ãïŒããŠã©ã ãåŒå
éšã§å©çšå¯èœã«ãããã§ããåç
§ã§åã蟌ã¿ããå Žå㯠`[&]` ãæå®ããŸãã
Q4. 颿°ãã倧ã㪠`std::vector` ãè¿ãèšèšã«ãããŠãC++11以éã®ã¢ãã³C++ã§æãæšå¥šãããæžãæ¹ã¯ã©ãã§ããïŒ
- 1. åŒæ°ã«çãã€ã³ã¿ `std::vector*` ãæž¡ããŠå
éšã§ new ãã
- 2. åŒæ°ã«åºåçšåç
§ `std::vector& out` ãæž¡ããŠæžã蟌ãŸãã
- 3. æ®éã« `std::vector` ãå€è¿ãïŒReturn by valueïŒããïŒã³ã³ãã€ã©ãèªåçã«ã ãŒããŸãã¯RVOæé©åãè¡ãïŒ
- 4. ã°ããŒãã«å€æ°ã« vector ã眮ããŠå
±æãã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒæ®éã« `std::vector` ãå€è¿ãïŒReturn by valueïŒããïŒã³ã³ãã€ã©ãèªåçã«ã ãŒããŸãã¯RVOæé©åãè¡ãïŒ
æ£è§£ã¯ãæ®éã« std::vector ãå€è¿ãïŒReturn by valueïŒãããã§ããã¢ãã³C++ã§ã¯RVOïŒæ»ã倿é©åïŒãã ãŒãã»ãã³ãã£ã¯ã¹ãåããããå€è¿ããè¡ã£ãŠãäžåã®ã³ããŒãªãŒããŒããããçºçããŸãããæãèªç¶ã§å®å
šãªAPIèšèšã«ãªããŸãã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â