ãªãC++ã¯é£ãããšèšãããã®ãïŒ
ã40幎ã®é²åãšãŒããªãŒããŒãããã®ä»£åã
ãC++ã¯é£è§£ãããŠæ«æããããèŠããããšãå€ãããããšèª°ããå£ãæããŸãããããããã®è€éãã«ã¯ãã¹ãŠ40å¹Žã®æŽå²çå¿
ç¶ãšèšèšå²åŠãååšããŸããçç±ãç¥ãã°ãææã¯çŽåŸãžãšå€ãããŸãã
1.1 ãC++ãé£ããããšæãã3å€§æ ¹æ¬åå
C++ã®é£ããã¯ãããªãã®çè§£åäžè¶³ã§ã¯ãããŸãããèšèªèªäœã®èè² ã£ãŠããã3ã€ã®ã¢ã³ã¹ã¿ãŒããåå ã§ãã
ð§ ãã³ã®ã³å
茩
æå°å®âŠæ£çŽã«èšã£ãŠãããã§ããïŒ C++ãé£ããããŸãïŒ PythonãJavaScriptãªãæ°è¡ã§æžããã®ã«ããã€ã³ã¿ã ã®åç
§ã ã®ãã³ããŒã³ã³ã¹ãã©ã¯ã¿ã ã®ãèŠããããšãå€ãããŠé ããã³ã¯ãããã§ãïŒ
ð»ââïž ã·ãã¯ãå
ç
ãããïŒãããæ£çŽã«èšã£ãïŒãã®æèŠã¯100%æ£ãããäžçã®ãããããã°ã©ãã§ãããC++ã®ãã¹ãŠãå®å
šã«çè§£ããŠãã人éã¯ååšããªãããšèªããã»ã©ãããã ããã³ã®ã³ãããªãããã»ã©è€éã«ãªã£ãã®ãããã®çç±ãèããããšã¯ãããïŒ
### ã¢ã³ã¹ã¿ãŒ1ïŒ40幎ã®å°å±€ãšã絶察çãªäžäœäºææ§ã
C++ã®æŽå²ã¯1979幎ã®ãC with Classesãã«å§ãŸããŸãã以æ¥40幎以äžã«ããããC++ã¯**ãäžåºŠèŠæ Œã«å
¥ããæ©èœããåŸããåé€ããããšãã»ãŒç¡ãã**ãšããé©ç°çãªäžäœäºææ§ãå®ãç¶ããŠããŸããã
- **Cèšèªã®æ©èœ**ïŒçãã€ã³ã¿ã`malloc`ãé
åããã¯ãïŒ
- **C++98/03ã®æ©èœ**ïŒã¯ã©ã¹ããã³ãã¬ãŒããç`new/delete`ãSTLïŒ
- **C++11/14ã®æ©èœ**ïŒã ãŒãã»ãã³ãã£ã¯ã¹ãã©ã ããã¹ããŒããã€ã³ã¿ïŒ
- **C++17/20ã®æ©èœ**ïŒ`std::optional`ãã³ã³ã»ãããã³ã«ãŒãã³ãã¢ãžã¥ãŒã«ïŒ
ããããã¹ãŠãã**ä»ã§ãåãã³ãŒãã®äžã§åæã«åããŸã**ã
ã€ãŸãããã1ã€ã®åŠçïŒæååæäœããªã¹ãèµ°æ»ïŒãæžãã®ã«ã**ã1980幎代ã®Cèšèªã®æžãæ¹ãããã2020å¹Žä»£ã®æå
ç«¯ã®æžãæ¹ããŸã§5éãã®éžæè¢ãååšãã**ã®ã§ããåŠç¿è
ã¯ãã®ãæŽå²ã®å°å±€ããäžåºŠã«èŠãããããããæ··ä¹±ããã®ã§ãã
---
### ã¢ã³ã¹ã¿ãŒ2ïŒããŒããªãŒããŒãããååïŒZero-overhead PrincipleïŒã
C++ã®çã¿ã®èŠªãã£ãŒãã»ã¹ãããŽã¹ãã«ããïŒBjarne StroustrupïŒãæ²ãããC++ã®æãç¥èãªèšèšå²åŠã§ãã
> **ãŒããªãŒããŒãããååã®2倧æçŸ©**:
> 1. 䜿ããªãæ©èœã«å¯ŸããŠãããã°ã©ãã¯1ãã€ãã®ã¡ã¢ãªã1ãµã€ã¯ã«ã®CPUæéãæ¯æã£ãŠã¯ãªããªãã
> 2. ããªããèªåã§ææžãã§ã¢ã»ã³ãã©ãCèšèªã§æžãããããèšèªæ©èœã䜿ã£ãæ¹ãé
ããªãããšã¯èš±ãããªãã
JavaãGoãC#ãªã©ã®èšèªã«ã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒGCïŒãããé
åã®èªåå¢çãã§ãã¯ããçµã¿èŸŒãŸããŠãããå®è¡æã«è£ã§ç£èŠã¹ã¬ãããåããŠããŸãã
ãããC++ã¯ã**ãã²ãŒã ã®60FPSãèªåé転ã®ãªã¢ã«ã¿ã€ã å¶åŸ¡ãéèHFTã§ã1ããç§ãè£æ¹ã®åæãªåŠçã§æ¢ããããŠã¯å°ãã**ãšããããã°ã©ãã®ããã«äœãããŠããŸãã
ãã®ããã**ãèªåã§å®å
šãå®ã£ãŠãããå®å
šç¶²ããèšèªãåæã«æãããšãé ãªã«æåŠããŠãã**ã®ã§ãã
---
### ã¢ã³ã¹ã¿ãŒ3ïŒæªå®çŸ©åäœïŒUndefined Behavior: UBïŒãšããæé»é¢
ä»ã®ã¢ãã³èšèªïŒJava, Rust, PythonïŒã§ã¯ãé
åã®ç¯å²å€ã«ã¢ã¯ã»ã¹ãããšå³åº§ã«ãäŸå€ïŒIndexOutOfBoundsExceptionïŒããæããŠå®å
šã«ããã°ã©ã ãæ¢ããŸãã
ãããC++ã§ã¯ãããã¯**ãæªå®çŸ©åäœïŒUndefined BehaviorïŒã**ãšãªããŸãã
- æ£åžžã«åããŠããŸããããããªãïŒäžçªæãããïŒ
- ã¡ã¢ãªã®å¥ã®å€ãçªç¶åãããããããªã
- ã»ã°ã¡ã³ããŒã·ã§ã³éåã§å³åº§ã«èœã¡ããããããªã
**ãäœãèµ·ããŠãèšèªä»æ§äžã¯æå¥ãèšããªãã**ããã®æªå®çŸ©åäœã®å°é·åããC++ã®ãããã°ãäžçäžæãããããããŠé£ããããŠããæå€§ã®èŠå ã§ãã
1.2 ä»èšèªãšã®ã¡ã³ã¿ã«ã¢ãã«ã®æ±ºå®çéã
ãªãä»ã®èšèªã§æžãã人ãC++ã§èºãã®ãïŒ ããã¯ãã³ã³ãã¥ãŒã¿ã«å¯ŸããåææèïŒã¡ã³ã¿ã«ã¢ãã«ïŒããçéã ããã§ãã
ð§ ãã³ã®ã³å
茩
ããã°ã©ãã®éªéãããªãâŠïŒã€ãŸããC++ã¯æå°æªã§é£ããã®ã§ã¯ãªãããããªããæé«å³°ã®è·äººãšä¿¡ããŠãããããå®å
šãã«ããå€ããŠãã³ãã«ãäžžããšæž¡ããŠãããŠãããã£ãŠããšãªãã§ãã!?
ð»ââïž ã·ãã¯ãå
ç
èŠäºãªæŽå¯ããïŒãã©ãŒãã¥ã©1ã®ãã·ã³ã«ABSãèªåãã¬ãŒããä»ããŠããªãã®ãšåããããäžçæé«éã§èµ°ãã¬ãŒãµãŒïŒC++ããã°ã©ãïŒã«ãåæãªã¢ã·ã¹ãã¯éªéã«ãããªããããã®ïŒ
### ãå®ãããéšå±ãvsãèéã®ãµãã€ãã«ã
| æ¯èŒè»ž | 管çåèšèªïŒJava / C# / Python / GoïŒ | 峿 Œãªçå®ïŒRustïŒ | C++ïŒããã°ã©ããžã®çµ¶å¯Ÿçä¿¡é ŒïŒ |
| :--- | :--- | :--- | :--- |
| **ã¡ã¢ãªã®å Žæ** | ä»®æ³ãã·ã³ïŒVMïŒãã©ã³ã¿ã€ã ã管ç | ã³ã³ãã€ã©ãåçšæ€æ»ã§å³å¯èšŒæ | ããã°ã©ããã¹ã¿ãã¯ãšããŒããçŽæå® |
| **ãªããžã§ã¯ãã®å¯¿åœ** | GCä»»ããããã€æ»ã¬ããã¯åãããªã | ã¹ã³ãŒããæãããšèªåãããã | RAIIã§èªåŸç®¡çïŒãŸãã¯æåè§£æŸïŒ |
| **å®å
šå¯Ÿç** | å®è¡æãªãŒããŒããããæã£ãŠå®å
šç¢ºä¿ | ã³ã³ãã€ã«æã«å³å¯ãã§ã㯠| **ãããã°ã©ãã¯èªåãäœãããŠãããç¥ã£ãŠããã**ãšä¿¡ããŠäœã§ãèš±å¯ãã |
| **ææ³ã®èŠçŽ** | ãããã°ã©ãããã°ããå®ãã | ãããã°ã©ãã®äžæ³šæãèš±ããªãã | **ãããã°ã©ãã®éªéãããªãïŒéããæåªå
ïŒã** |
C++ãæžããšããããšã¯ã**ãOSãšããŒããŠã§ã¢ïŒCPUã»ãã£ãã·ã¥ã¡ã¢ãªã»ã¬ãžã¹ã¿ïŒã®ããåºãã®çŸå®ã«ãçŽ æã§è§Šããã**ãšããããšã§ãã
ãã®ã¡ã³ã¿ã«ã¢ãã«ã®éãã«æ°ã¥ããªããŸãŸãææ³ãã ããåŠãŒããšãããšãæ¿ããéåæã𿫿æãå³ããããšã«ãªããŸãã
1.3 çŸä»£ïŒã¢ãã³C++ïŒãæãéãããå®å
šãžã®é²åã
ãããã人éã¯ç¥ã§ã¯ãããŸãããã©ãã»ã©åªç§ãªããã°ã©ãã§ããã¹ãããŸããããã§èªçããã®ããã¢ãã³C++ãã§ãã
### ããŒããªãŒããŒãããããç¶æãããŸãŸãå®å
šæ§ãæã«å
¥ãã
2011幎ïŒC++11ïŒã®ç»å Žã¯ãC++ã®æŽå²ã«ãããæå€§ã®ãã©ãã€ã ã·ããã§ããã
ã¢ãã³C++ã®åèšèã¯ã**ãå®è¡æã³ã¹ãã1ããç§ãå¢ãããã«ãã³ã³ãã€ã«æãšåã®åã§ãã°ãæ²æ»
ããã**ã§ãã
1. **ç new/delete ã®æ²æ»
ïŒã¹ããŒããã€ã³ã¿ïŒ**:
`std::unique_ptr` ã¯ãã³ã³ãã€ã«æã«è§£æŸã³ãŒããèªåæ¿å
¥ããããã**çãã€ã³ã¿ãšå
šãåããµã€ãºã»å
šãåãå®è¡é床ã§ãã¡ã¢ãªãªãŒã¯ã100%é²ããŸã**ã
2. **ç¡é§ãªãã£ãŒãã³ããŒã®æ²æ»
ïŒã ãŒãã»ãã³ãã£ã¯ã¹ïŒ**:
äžæãªããžã§ã¯ãã®æææš©ãç¬æã«ç§»è²ããããšã§ãããã°ã©ããè€éãªãã€ã³ã¿æäœãææžãããªããŠãæé«éã®ããã©ãŒãã³ã¹ãåŸãããããã«ãªããŸããã
3. **NULLãã€ã³ã¿ã®æ²æ»
ïŒ`std::optional`ïŒ**:
ãå€ãååšããªããããããªããããšãåãšããŠè¡šçŸãããã§ãã¯å¿ãã«ããã¯ã©ãã·ã¥ãæªç¶ã«é®æããŸãã
ã€ãŸãã**ç§ãã¡ãçŸåšèŠããã§ãããé£ãããã®å€ãã¯ãå®ã¯å€ãã¬ã¬ã·ãŒC++ã®è² ã®éºç£ã§ãããã¢ãã³C++ã¯ãããæãããã«äœããã**ã®ã§ãã
1.4 C++ãšã©ãåãåãã¹ããïŒãçãæ®ãããã®3倧éåã
åºå€§ãããC++ã®æµ·ã§æººããªãããã«ãçŸå Žã®ãããå®è·µããŠããçŸå®çãªçåæŠç¥ããäŒãããŸãã
### éå1ïŒããã¹ãŠã®æ©èœã䜿ãããšããªãã
ãã®Bjarne Stroustrupèªèº«ãè¿°ã¹ãŠããéããC++ã®å
šä»æ§ããã¹ã¿ãŒããããšããã®ã¯æã®éªšé ã§ãã
GoogleãEpic Gamesã任倩å ãªã©ã®äžæµäŒæ¥ãã**ãèªç€Ÿã®ã³ãŒãã£ã³ã°èŠçŽã§ã䜿ã£ãŠããC++æ©èœã®å®å
šãªãµãã»ãããå®ããŠããã**ã®ã宿
ã§ãïŒå€éç¶æ¿ã®çŠæ¢ãç¹å®ãã³ãã¬ãŒãæ©èœã®å¶éãªã©ïŒã
### éå2ïŒãã¬ã¬ã·ãŒãšã¢ãã³ã®å¢çç·ããæç¢ºã«ãã
- æ¢åã®ã¬ã¬ã·ãŒã³ãŒããèªããšãã¯ãC++03ã®æ³¥èãã¡ã¢ãªç®¡çãã®èŠç¹ã§èªãã
- èªåã§æ°ããã³ãŒããæžããšãã¯ãã¢ãã³C++ã®å®å
šãªã€ãã£ãªã ïŒRAIIãã¹ããŒããã€ã³ã¿ïŒãã§æžãã
ãã®2ã€ã®èŠç¹ãæç¢ºã«åãæ¿ããïŒäºåæµïŒããšããæå€§ã®é²è¡çã«ãªããŸãã
### éå3ïŒãããŒã«ïŒéçè§£æã»ãµãã¿ã€ã¶ïŒãã«é Œã
人éããããæ³šæããŠããã°ã¯åºãŸãã
- **AddressSanitizer (ASan)**: ã¡ã¢ãªç Žå£ããªãŒã¯ãå®è¡æã«100%æ€åºããããŒã«
- **Clang-Tidy**: ãããã«å€ãæžãæ¹ãããããããã®ãã€ã³ã¿ã¯å±éºã ãããšææããŠãããéçè§£æ
çŸä»£ã®C++éçºã¯ããããã®åŒ·åãªããŒã«ãšãã¢ããã°ã©ãã³ã°ããããšã§åããŠå®å
šãæ
ä¿ã§ããã®ã§ãã
ð¡ ãã®ã»ã¯ã·ã§ã³ã®éèŠãã€ã³ã
- C++ã®é£ããã¯åã®ä»£å: ãŒããªãŒããŒãããååãš40幎ã®äžäœäºææ§ãé£ããã®æ£äœãã¢ãã³ã€ãã£ãªã ãšããŒã«ã掻çšããå®å
šãªãµãã»ããã䜿ãããªãã®ãçã®ããã§ãã
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. C++ã®çã¿ã®èŠªãæå±ããããŒããªãŒããŒãããååãã®æ£ãã説æã¯ã©ããïŒ
- 1. ããã°ã©ããæç€ºçã«äœ¿çšããªãæ©èœã«å¯ŸããŠãäžåã®å®è¡æã³ã¹ãïŒã¡ã¢ãªã»CPUïŒãæãããŠã¯ãªããªã
- 2. ã³ã³ãã€ã«ã«ãããæéã0ç§ã«è¿ã¥ããªããã°ãªããªã
- 3. ãã¹ãŠã®å€æ°ãã°ããŒãã«ã¡ã¢ãªã«é
眮ããªããã°ãªããªã
- 4. ãã¹ãŠã®ã¯ã©ã¹ã§ç¶æ¿ã䜿ã£ãŠã¯ãªããªã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒããã°ã©ããæç€ºçã«äœ¿çšããªãæ©èœã«å¯ŸããŠãäžåã®å®è¡æã³ã¹ãïŒã¡ã¢ãªã»CPUïŒãæãããŠã¯ãªããªã
ãŒããªãŒããŒãããååãšã¯ãã䜿ã£ãŠããªãæ©èœã«1ãã€ããã³ã¹ããæããªãããææžãã®ã¢ã»ã³ãã©ãšåç以äžã®æ§èœãèšèªæ©èœã§å®çŸããããšããC++ã®æ ¹æ¬ææ³ã§ãã
Q2. JavaãGoãªã©ã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒGCïŒèšèªãšæ¯èŒãããšããC++ãGCãèšèªä»æ§ã«çµã¿èŸŒãŸãªãæå€§ã®çç±ã¯ã©ããïŒ
- 1. GCãå®è£
ããæè¡ãC++éçºé£ã«ååšããªããã
- 2. 60FPSã®ã²ãŒã ããªã¢ã«ã¿ã€ã å¶åŸ¡ã«ãããŠãGCã«ããåæãªåæ¢æéïŒStop-the-WorldïŒãã¡ã¢ãªãããããªã³ãã®å¢å ã蚱容ã§ããªãçŸå Žããããã
- 3. GCã䜿ããšã³ã³ãã€ã«ãšã©ãŒã«ãªããã
- 4. C++ã®ããã°ã©ã ã¯ãã¹ãŠã¯ã©ãŠãäžã§ã®ã¿å®è¡ããããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒ60FPSã®ã²ãŒã ããªã¢ã«ã¿ã€ã å¶åŸ¡ã«ãããŠãGCã«ããåæãªåæ¢æéïŒStop-the-WorldïŒãã¡ã¢ãªãããããªã³ãã®å¢å ã蚱容ã§ããªãçŸå Žããããã
ã²ãŒã ãšã³ãžã³ãçµã¿èŸŒã¿ãèªåé転ãéèHFTãªã©ã1ããç§ã®é
å»¶ãèš±ãããªãçŸå Žã®ããã«ãC++ã¯ããã¯ã°ã©ãŠã³ãã§åæã«åãGCã®æ¡çšãæåŠããŠããŸãã
Q3. C++ã«ããããæªå®çŸ©åäœïŒUndefined Behavior: UBïŒãã®æããããšããŠãæãé©åãªãã®ã¯ã©ããïŒ
- 1. å¿
ãç»é¢ãèµ€ããªã£ãŠãšã©ãŒãã€ã¢ãã°ãåºã
- 2. ãããŸããŸæ£åžžã«åããŠããããã«èŠããŠããŸããããšããããç°å¢ãå€ãã£ãç¬éã«äºæž¬äžèœãªãã°ãããŒã¿ç Žå£ãåŒãèµ·ãã
- 3. ã³ã³ãã€ã©ãèªåçã«æ£ããã³ãŒãã«æžãæããŠããã
- 4. ããã°ã©ã ã®å®è¡é床ã10åé«éã«ãªã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒãããŸããŸæ£åžžã«åããŠããããã«èŠããŠããŸããããšããããç°å¢ãå€ãã£ãç¬éã«äºæž¬äžèœãªãã°ãããŒã¿ç Žå£ãåŒãèµ·ãã
æªå®çŸ©åäœã¯ãäœãèµ·ããŠãèšèªèŠæ Œäžæå¥ãèšããªããç¶æ
ã§ããã峿»ããäžèŠæ£åžžã«åäœããŠåŸããèŽåœçãªããŒã¿ç Žå£ãåŒãèµ·ããç¹ãæãå±éºã§ãã
Q4. C++ã®åºå€§ããã仿§ãšè€éãã«å¯ŸããŠãçŸå Žã®ãããå®è·µãã¹ãçŸå®çãªå§¿å¢ãšããŠæãé©åãªãã®ã¯ã©ããïŒ
- 1. ãã¹ãŠã®ææ°ä»æ§ã»ãã³ãã¬ãŒãã¡ã¿ããã°ã©ãã³ã°ãç¡çã«1ã€ã®ãããã¯ãã«è©°ã蟌ã
- 2. C++ã®æ©èœãäžå䜿ãããçŽç²ãªã¢ã»ã³ãã©ã ãã§ã³ãŒããæžã
- 3. èªç€Ÿã»ããŒã å
ã§å®å
šãªC++æ©èœã®ãµãã»ãããåæããã¢ãã³C++ã®RAIIãéçè§£æããŒã«ïŒASan/Clang-TidyïŒã掻çšããŠå®å
šæ§ãæ
ä¿ãã
- 4. ãã¹ãã³ãŒããäžåæžããã«åã ãã§ãªãªãŒã¹ãã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒèªç€Ÿã»ããŒã å
ã§å®å
šãªC++æ©èœã®ãµãã»ãããåæããã¢ãã³C++ã®RAIIãéçè§£æããŒã«ïŒASan/Clang-TidyïŒã掻çšããŠå®å
šæ§ãæ
ä¿ãã
Googleãªã©ã®äžæµããã¯äŒæ¥ãå«ããå®åã§ã¯ãå®å
šãªæ©èœãµãã»ããã®åæããšãéçè§£æã»ãµãã¿ã€ã¶çã®èªåæ€èšŒããŒã«ãã®æŽ»çšãæšæºçãªã¢ãããŒãã§ãã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â