ç§ã¯ããã°ã®ããã«ãã£ãšåã«ãã®èšäºãæžããŸããããçŸåšã¯æŸæ£ãããŠããŸãã ç§ã«ã¯éåžžã«æçšãªæ
å ±ãå«ãŸããŠããããã«æããã®ã§ãããããã æ¶ããŠã»ãããããŸããã äœãããã§ã«å€ããªã£ãŠããå¯èœæ§ãéåžžã«é«ããããããŸãããã圌ãããããç§ã«ç€ºããŠããããæè¬ããŸãã
ååãšããŠãé«éãå¿
èŠãªå Žåã¯C ++ã䜿çšãããŸãã ããããC ++ã§ã¯ãå€ãã®åŽåããããããšãªããPython / Rubyãããé
ãã³ãŒããååŸã§ããŸãã å€æ°ã®
Any-Lang察C ++æ¯èŒãæ©èœããã®ã¯ããã®ã³ãŒãã§ãã
äžè¬ã«ãæé©åã«ã¯3ã€ã®ã¿ã€ãããããŸãã
- æ¢è£œã®ãã¹ãæžã¿ã®äœæ¥ã³ãŒãã®æé©åã
- æåã¯æé«ã®ã³ãŒããæžããŠããŸãã
- æé©ãªãã¶ã€ã³ã䜿çšããã ãã§ãã
ãããžã§ã¯ããå®äºããŠäœ¿çšãããåŸã«ã®ã¿ãå®æããã³ãŒãã®æé©åã«ç¹å¥ãªæ³šæãæãå¿
èŠããããŸãã ååãšããŠããããžã§ã¯ãã®ããäžéšã§æé©åãå¿
èŠã«ãªããŸãã ãã®ãããæåã«ããã»ããµæéã®ã»ãšãã©ãæ¶è²»ããã³ãŒãå
ã®å ŽæãèŠã€ããå¿
èŠããããŸãã çµå±ã®ãšããããã·ã³æéã®1ïŒ
ããå ããªãå Žåãã³ãŒãã500ïŒ
ã§ãé«éåãããã€ã³ãã¯äœã§ããããïŒ ãŸããååãšããŠãã³ãŒãã§ã¯ãªãã¢ã«ãŽãªãºã èªäœã®æé©åã«ãããé床ã倧å¹
ã«åäžããããšãèŠããŠããå¿
èŠããããŸãã 圌ããèšãã®ã¯ããã®ã¿ã€ãã®ããã«ã€ããŠã§ãïŒãææå°æ©ãªæé©åã¯æªãïŒcïŒã
2çªç®ã®ã¿ã€ãã®æé©åã¯ãããã©ãŒãã³ã¹èŠä»¶ãèæ
®ããã³ãŒãã®åæèšèšã§ãã ãã®èšèšã¯ãæ©æã®æé©åã§ã¯ãããŸããã
3çªç®ã®ã¿ã€ãã¯ãå®å
šãªæé©åã§ãããããŸããã ãããã次åã®èšèªæ§æã®åé¿ã§ãã C ++èšèªã¯éåžžã«è€éã§ãããããC ++èšèªã䜿çšãããšãã¯ã䜿çšããã³ãŒããã©ã®ããã«å®è£
ãããŠããããç¥ãå¿
èŠããããŸãã ããã°ã©ããããã»ããµãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®æ©èœãèæ
®ããå¿
èŠãããã»ã©ååã«äœãã§ãã
1. C ++èšèªã®æ©èœ
1.1ã åŒæ°ãæž¡ã
åŒæ°ãå€ã§ã¯ãªãåç
§ãŸãã¯ãã€ã³ã¿ãŒã§æž¡ããŸãã åŒæ°ãå€ã§æž¡ããšããªããžã§ã¯ãã®å®å
šãªã³ããŒãäœæãããŸãã ãã®ãªããžã§ã¯ãã倧ããã»ã©ãã³ããŒããå¿
èŠããããŸãã ãããŠãã¯ã©ã¹ã®ãªããžã§ã¯ããããŒãã«ã¡ã¢ãªãå²ãåœãŠãå Žåãããã¯å®å
šã«çœå®³ã§ãã ãã¡ãããåçŽåã¯å€ã§æž¡ãããšãã§ãããŸãæž¡ãå¿
èŠããããŸãã ãã ããè€éãªãã®ã¯ãåç
§ãŸãã¯ãã€ã³ã¿ã«ãã£ãŠã®ã¿æž¡ãå¿
èŠããããŸãã
1.2ã äŸå€
å¿
èŠãªå Žåã«ã®ã¿äŸå€ã䜿çšããŠãã ããã å®éãäŸå€ã¯ããªãéãã¡ã«ããºã ã§ãã ãããã£ãŠã
goto
ãå
¥ãåã«ãªã£ãã«ãŒãã®çµäºãªã©ã®ä»£ããã«äœ¿çšããªãã§ãã ããã ç°¡åãªã«ãŒã«ïŒäŸå€ã¯äŸå€çãªç¶æ³ã§ã®ã¿ã¹ããŒãããŸãã ããã¯ã圌ããå®å
šã«æŸæ£ãããå¿
èŠããããšããæå³ã§ã¯ãããŸããã äŸå€ã®äœ¿çšèªäœã¯ãå°éã®è¿œå ã³ãŒãã®ããã«ããããªãªãŒããŒããããäžããŸãã ããã©ãŒãã³ã¹ã«å¯Ÿããå®éã®åœ±é¿ã¯ã誀çšã®ã¿ã§ãã
1.3ã RTTI
é«éãå¿
èŠãšããã³ãŒãã§ã¯ãRTTIã䜿çšããªãã§ãã ããã ã»ãšãã©ã®ã³ã³ãã€ã©ïŒãŸãã¯ãã¹ãŠïŒã®RTTIã¡ã«ããºã ã¯ãæååæ¯èŒã«ãã£ãŠå®è£
ãããŸãã ã»ãšãã©ã®å Žåãããã¯éèŠã§ã¯ãããŸããã ãã ããã³ãŒãã«ã¯é«éãå¿
èŠãªå ŽåããããŸãã ãã®å Žåãæ°å€ã¯ã©ã¹èå¥åãªã©ãå¥ã®ãœãªã¥ãŒã·ã§ã³ãèãåºãå¿
èŠããããŸãã
1.4ã ã€ã³ã¯ãªã¡ã³ããšãã¯ãªã¡ã³ã
ã€ã³ã¯ãªã¡ã³ããšãã¯ãªã¡ã³ãã®ãã¬ãã£ãã¯ã¹åœ¢åŒã䜿çšããŸãã C ++éçºè
ã¯ãæ¥é èŸåœ¢åŒïŒ
++i
ããã³
--i
ïŒã®ã¿ã䜿çšããå¿
èŠã«å¿ããŠæ¥å°ŸèŸåœ¢åŒïŒ
i++
ïŒã®ã¿ã䜿çšããç¿æ
£ã身ã«ä»ããå¿
èŠããããŸãã åŸçœ®åœ¢åŒã¯ããªããžã§ã¯ããå€æŽããããŸã§äžæå€ãä¿åããŠè¿ãããšã§å®è£
ãããŸãã ãã¡ãããåçŽãªå Žåãçµã¿èŸŒã¿åã®æäœã§ã¯ãã³ã³ãã€ã©ãŒã¯ã³ãŒããæé©åããäžæå€æ°ãäœæããã«å®è¡ã§ããŸãã ãã ããã«ã¹ã¿ã ã¯ã©ã¹ã®å Žåãããããæé©åãããŸããã
1.5ã äžæãªããžã§ã¯ããäœæããªãã§ãã ãã-1
ããšãã°ã次ã®ã³ãŒãã䜿çšããŠäžæãªããžã§ã¯ããäœæãããŸãã
std::string s1, s2, s3; ... std::string s = s1 + s2 + s3;
ãã®å Žåã2ã€ã®è¿œå ã®äžæãªããžã§ã¯ããäœæãã
std::string tmp1 = s1 + s2;
ããã³
std::string tmp2 = tmp1 + s3;
ã æ£ããæååé£çµã¯æ¬¡ã®ããã«ãªããŸãã
std::string s1, s2, s3; ... std::string s = s1; s += s2; s += s3;
1.6ã äžæãªããžã§ã¯ããäœæããªãã§ãã ãã-2
å€æ°ã¯ã©ãã§ã宣èšã§ããŸãã ãŸãããã®å€æ°ãè€éãªãªããžã§ã¯ãã§ããå Žåãå¿
èŠã®ãªãå Žæã§å®£èšããªãã§ãã ããã äŸïŒ
void foo(int x) { int a, b, c; std::string s;
1.7ã ã¡ã¢ãªãŒäºçŽ
åã®äŸïŒã»ã¯ã·ã§ã³1.5ïŒã«æ»ããšã絶察çã«æ£ããé£çµæ¹æ³ã¯æ¬¡ã®ããã«ãªããŸãã
std::string s1, s2, s3; ... std::string s; s.reserve( s1.size() + s2.size() + s3.size() ); s += s1; s += s2; s += s3;
ã¡ã¢ãªå²ãåœãŠæäœã¯éåžžã«é«äŸ¡ã§ãã ãŸãã
reserve
ãåŒã³åºããŠä»¥åã«äžåºŠå²ãåœãŠãããšããããããããã»ããµæéã倧å¹
ã«ç¯çŽã§ããŸãã STLã®å Žåãããã¯
vector
ã¯ã©ã¹ãš
string
ã¯ã©ã¹ã«é©çšãããŸãã
1.8ã äžèŠãªäœæ¥ã¯äžåé¿ããŠãã ããã
ãã®ã¢ããã€ã¹ã¯åå¿è
åãã®æ¬ã®äžã«ããããã«æããC ++ã®åºæ¬çãªç解ã§ååã«ç解ã§ããã¯ãã§ã...ããããçµéšã®æµ
ãããã°ã©ããŒã®äžã«ã¯ããã«ã€ãŸãã人ãããŸãã
std::string s = "";
1è¡ç®ã§ã¯ãã³ã³ã¹ãã©ã¯ã¿
std::string(const char *)
ãåŒã³åºãããŸãããããã¯æååã空ã§ããããšãèªèããŸããã 圌ã¯ããã®é·ããææ¡ããã¡ã¢ãªå²ãåœãŠãšã³ããŒãµã€ã¯ã«ãå®è¡ããã¡ã¢ãªãã³ãã©ãäœããããªã©ãè©Šã¿ãŸããããã¯ãåãªãã³ã¹ããããé«äŸ¡ã§ãã
std::string s;
2è¡ç®ãåãç¶æ³ã§ãã
operator = (const char *s)
å®è¡ãããŸããããããã°ã©ããŒãã空ã®æååãååŸãããã£ãã ãã§ããããŸããã åçŽãªåŒã³åºãã®æ¹ãå¹ççã§ãã
s.clear();
1.9ã for / whileã«ãŒãã§é¢æ°ãåŒã³åºãã³ã¹ããèŠç©ãããŸã
STLã䜿çšãããšãéè·¯ã®æ©èœãåŒã³åºãããšãå¿é
ããå¿
èŠããããŸããã
std::vector<int> vec; ... for(size_t i = 0; i < vec.size(); ++i) { ... }
ãã®å Žåãå®ãããã§ãã ããã¯ã次ã®ã³ãŒããšåçã§ãã
size_t size = vec.size(); for(size_t i = 0; i < size; ++i)
ãã ããããã¯åžžã«ããã§ã¯ãããŸããã C ++ 11以åã®äžè¬çãªèª€è§£ã¯ãããã°ã©ãã
std::list::size
ããåãã¢ã«ãŽãªãºã ã®è€éããæåŸ
ããŠããããšã§ããããå€ãã®å®è£
ã§ã¯ãã®è€éãã¯OïŒNïŒã§ããã
if( list.empty() )
ãåŒã³åºã代ããã«ãç¹ã«
if( list.size() > 0 )
if( list.empty() )
ãããã¯ç¹ã«äžå¿«ã«èŠããŸããã
1.10ã ãªã¹ããŸãã¯äž¡ç«¯ãã¥ãŒãé
åžã§ãããã¯ã¿ãŒã䜿çšããªãã§ãã ãã
vector
ã³ã³ããã¯ãé£ç¶ããäžé£ã®ãã€ããã¡ã¢ãªã«æ ŒçŽããããã«èšèšãããŠããŸãã ãããã£ãŠãæ°ããèŠçŽ ãè¿œå ãããšãã«ãååãªã¡ã¢ãªããªãå Žåãã³ã³ããã¯æ°ããã¡ã¢ãªãå²ãåœãŠãå€ãå Žæããæ°ããå Žæã«ããŒã¿ãã³ããŒããå¿
èŠããããŸãã ãããé »ç¹ã«çºçããå Žåãã³ãŒãã®ããã©ãŒãã³ã¹ã倧å¹
ã«äœäžããå¯èœæ§ããããŸãã
vector
ãšã¯ç°ãªãã
list
ãŸãã¯
deque
ã³ã³ããã¯ããŒã¿ã®é£ç¶ããã·ãŒã±ã³ã¹ãä¿åããªããããã³ããŒã¯å¿
èŠãããŸããã
äžæ¹ãäºåããã¯ã¢ããã§
vector
ã䜿çšããïŒã€ãŸããå¿
èŠãªãã¹ãŠã®ã¡ã¢ãªã1åå²ãåœãŠãïŒããšã¯ãæãé«éã§çµæžçãªæ¹æ³ã§ãã
list
ãŸãã¯
deque
å Žåãã¡ã¢ãªã®å°ããªãã£ã³ã¯ãäœåºŠãå²ãåœãŠãããããã§ãã ã³ã³ãããéžæãããšãã¯ãã³ã³ããã§å®è¡ãããæäœãæ£ç¢ºã«æ€èšããå¿
èŠããããŸãã
1.11ã ãªã³ã¯ãŸãã¯ãã€ã³ã¿ãŒïŒ
ãã€ã³ã¿ãŒã§ã¯ãªããªã³ã¯ã䜿çšããŠã¿ãŠãã ããã ãªã³ã¯ã«ã¯ãã§ãã¯ã¯äžèŠã§ãã ãªã³ã¯ã¯ãªããžã§ã¯ããçŽæ¥æãããã€ã³ã¿ãŒã«ã¯èªã¿åãã¢ãã¬ã¹ãå«ãŸããŠããŸãã
1.12ã ã³ã³ã¹ãã©ã¯ã¿ãŒåæåãªã¹ã
ã³ã³ã¹ãã©ã¯ã¿ãŒåæåãªã¹ãã®å€æ°ãåæåããŸãã ãã以å€ã®å Žåãæåã«åæåããã次ã«å€ãå²ãåœãŠãããŸãã
2.ã³ã³ãã€ã©
ã³ã³ãã€ã©ã¯ãããŸããŸãªæé©åãå®è¡ã§ããŸãã æã
圌ã¯å©ããããã¹ãã§ãã éã«ãæåã§æé©åããããšãããšããã®ãããªããã«ãããªãã§ã¯ã³ã³ãã€ã©ãã³ãŒããæé©åã§ããªãããšããããŸãã
2.1ã å±éãµã€ã¯ã«
ææ°ã®ããã»ããµã«ã¯è€æ°ã®æ©èœããã€ã¹ïŒALUããã³FPUïŒãå«ãŸããŠãããåœä»€ã䞊è¡ããŠå®è¡ã§ããŸããã€ãŸãã1ã€ã®ã¯ããã¯ãµã€ã¯ã«ã§1ã€ã®ã³ã¢ã§è€æ°ã®åœä»€ãå®è¡ã§ããŸãã ãããã£ãŠããµã€ã¯ã«ã®å±éã«ãããããå°ãªãã¹ãããã§æäœãå®è¡ã§ããŸãã å±éã«ãããæ¯èŒããã³æ¡ä»¶ä»ãé·ç§»ã®æ°ãåæžãããŸãã
for(int i = 0; i < len; ++i) { sum += s[i]; }
ã®ãããªãã®ã«å±éããå¿
èŠããããŸã
if( len >= 4 ) { for(; i < len - 3; i += 4) { sum += s[i]; sum += s[i + 1]; sum += s[i + 2]; sum += s[i + 3]; } } switch(len % 4) { case 3: sum += s[i + 2]; case 2: sum += s[i + 1]; case 1: sum += s[i]; break; }
以äžã¯ã
switch
ãªãã®ã¢ã»ã³ãã©ã³ãŒãã®äžéšã§ãã
.L5: movsx rdi, BYTE PTR [rbx+rax] movsx rdx, BYTE PTR [rbx+1+rax] movsx r11, BYTE PTR [rbx+2+rax] movsx r10, BYTE PTR [rbx+3+rax] movsx r9, BYTE PTR [rbx+4+rax] movsx r8, BYTE PTR [rbx+5+rax] add rsi, rdi movsx rdi, BYTE PTR [rbx+6+rax] add rsi, rdx movsx rdx, BYTE PTR [rbx+7+rax] add rax, 8 add rsi, r11 add rsi, r10 add rsi, r9 add rsi, r8 add rsi, rdi add rsi, rdx cmp rax, rcx jne .L5
ãã®å Žåãå¢åã¯4ãã€ãã§ã¯ãªãã8ãã€ãã§ããããšãããããŸãã ã«ãŒãå
ã®è¿œå æ¡ä»¶ãŸãã¯ã«ãŒãã«ãŠã³ã¿ãŒã«åœ±é¿ããèšç®ã«ãããã«ãŒããæ¡åŒµã§ããªããªããŸãã
ã³ã³ãã€ã©ãŒã¯ã«ãŒãã®å±éã«ç¬ç«ããŠé¢äžããŸãã ãããã§ããããã«åœŒã¯å©ããããã¹ãã§ãã ãŸããå°ããªãµã€ã¯ã«ã1ã€ã«ãŸãšããããšãæãŸããããšã§ãã ãã ããæ¡ä»¶ãŸãã¯ãµã€ã¯ã«ã®å€§èŠæš¡ãªããã£ãååšããå Žåã¯ãéã«ãå°ãªããšã1ã€ã®ãµã€ã¯ã«ãã³ã³ãã€ã©ãŒã«ãã£ãŠãããã€ãããããã«ãããã€ãã®ãµã€ã¯ã«ã«åå²ããããšããå§ãããŸãã
2.2ã ã³ã³ãã¥ãŒãã£ã³ã°ã®æ azine-1
æ¡ä»¶
&&
ïŒè«çANDïŒããã³
||
ïŒè«çORïŒã³ã³ãã€ã©ãŒã¯å·Šããå³ã«åŠçããŸãã è«çANDãèšç®ãããšãã«ãæåã®æ¡ä»¶ãfalseã®å Žåã2çªç®ã®æ¡ä»¶ãèšç®ãããŸããã ãããã£ãŠãè«çORã§ã¯ãæåã®æ¡ä»¶ãçã®å Žåã2çªç®ã®æ¡ä»¶ãèšç®ããŠãæå³ããããŸããã 以äžã«ç°¡åãªäŸã瀺ããŸãã
const char *s; ... if( strlen(s) > 3 && s[0] == 'y' ) { ... }
æåã®æåãyã«ãªãããã«ã3æå以äžã®æååãå¿
èŠã§ãã åæã«ã
strlen(s)
ã¯é«äŸ¡ãªæäœã§ããã
s[0] == 'y'
ã¯å®äŸ¡ã§ãã ãããã£ãŠããããã亀æããå Žåã¯ãããããæååã®é·ããèšç®ããå¿
èŠã¯ãããŸããã
if( s && s[0] == 'y' && strlen(s) > 3 ) { ... }
2.3ã ã¬ã€ãžãŒã³ã³ãã¥ãŒãã£ã³ã°-2
é
延èšç®ã¯ã
&&
ãŸãã¯
||
ããªãŒããŒããŒããããŸã§æ©èœããŸããã ã ãªãŒããŒããŒããããæŒç®åã¯é¢æ°åŒã³åºãã§ãïŒ
bool operator && (1, 2)
ãããã£ãŠãåŒã³åºãã®åã«ãã¹ãŠã®åŒæ°ãè©äŸ¡ããå¿
èŠããããŸãã
2.4ã ã¹ã€ãããŸãã¯å ŽåïŒ
å¯èœãªéãã
switch
ã䜿çšããŠã¿ãŠãã ããã
if
æ¡ä»¶ãšã¯ç°ãªãã
switch
å€ãã®å ŽåãããŒãã«ãä»ããŠæé©åãããŸãã äŸïŒ
int func(int i) { if(i == 1 ) return 10; else if( i == 2 ) return 20; else if( i == 3 ) return 30; else if( i == 4 ) return 40; else if( i == 5 ) return 50; return 100; }
ã§æŸé
cmp edi, 1 mov eax, 10 je .L2 cmp edi, 2 mov al, 20 je .L2 cmp edi, 3 mov al, 30 je .L2 cmp edi, 4 mov al, 40 je .L2 mov al, 50 cmp edi, 5 mov edx, 100 cmovne eax, edx
ãããŠãããã«ã³ãŒãããããŸãïŒ
int func(int i) { switch(i) { case 1: return 10; break; case 2: return 20; break; case 3: return 30; break; case 4: return 40; break; case 5: return 50; break; default: return 100; } }
ã§æŸé
dec edi mov eax, 100 cmp edi, 4 ja .L10 mov eax, DWORD PTR CSWTCH.1[0+rdi*4] CSWTCH.1: .long 10 .long 20 .long 30 .long 40 .long 50
2.5ã ã€ã³ã©ã€ã³ããŒã¯ãŒã
ãã®ããŒã¯ãŒãã¯ãããã°ã©ã ãé«éåããããã«èæ¡ãããããã§ãã ããããæåéãã«ãããåããããŠãåé¢æ°ã®åã«
inline
æ¿å
¥ãã人ãããŸãã ããã«ãããã³ãŒããèšåŒµããŸãã ã³ãŒãã倧ããã»ã©ãããå€ãã®ã¡ã¢ãªãç¹ã«ããã»ããµãã£ãã·ã¥å
ã®ã¡ã¢ãªãå¿
èŠã«ãªããŸãã çŸä»£ã®ã³ã³ãã€ã©ãŒã¯ãé·ãéãã®èšèã«æ³šæãæãããšããããé¢æ°ãã€ã³ã©ã€ã³ã«ãããšããšããªããšããèªåã§æ±ºå®ããŸããã ããããããã°ã©ããŒã¯ãŸã
__forceinline
ãããªãã®ãæ¿å
¥ããããšã§ã³ãŒããèšåŒµãããããšããŸãã
inline
ã¯ãæ¬åœã«å¿
èŠãªå Žåã«ã®ã¿äœ¿çšããŠãã ããã
2.6ã RVO-æ»ãå€ã®æé©å
ãã®æé©åã«ãããC ++ã³ã³ãã€ã©ãæ»ãå€ã®ã³ããŒãäœæã§ããªããªããŸãã ã³ã³ãã€ã©ã¯ãã®æé©åã䜿çšããå¿
èŠããããŸãã
ãããã£ãŠã1ã€ã®åºå£ãã€ã³ãã¯ãããçŸãããã®ã®ãããŸãå¹æçã§ã¯ãããŸããã
std::string bar(...) { std::string result; if( x ) { result = foo(); } return result;
ã³ã³ãã€ã©ãŒãNRVOãæå¹ã«æŽ»çšããããšãåŠç¿ããããããã®ã¢ããã€ã¹ã¯ãã®é¢é£æ§ãã»ãšãã©å€±ããåé
眮ã®å¯èœæ§ããããŸãã ãã ããNRVOãåžžã«é¢äžãããšã¯éããããã¹ãŠã®ãªããžã§ã¯ãã«ç§»åã³ã³ã¹ãã©ã¯ã¿ãŒãããããã§ã¯ãããŸããã
2.7ã æ§é ã®æŽå
ã¯ã©ã¹ãšæ§é äœã宣èšããéã«ã¯ãå€æ°ããµã€ãºã®éé ã«äžŠã¹ãŠã¿ãŠãã ããã ãµã€ãºã8ãã€ãæªæºã®å€æ°ãã°ã«ãŒãåããå Žåã¯ç¹ã«æ³šæãå¿
èŠã§ãã ã³ã³ãã€ã©ã¯ãæé©åã®ããã«ãå€æ°ã®ã¢ãã¬ã¹ãæŽåããŸããããã¯ãæŽåãããã¢ãã¬ã¹ã§
long
åã®å€æ°ã«ã¢ã¯ã»ã¹ããã®ã«ããã»ããµã¯ããã¯ã1ã€ããå¿
èŠãªãããã§ãã äžéšã®ã¢ãŒããã¯ãã£ã§ã¯ãéå¢çæŽåã¢ãã¬ã¹ã§ã®èªã¿åãã¯äžè¬ã«äžå¯èœã§ãã 倧ãŸãã«èšã£ãŠãéå¢çå€æ°ã¯ããã€ãã®ã¡ã¢ãªã»ã«ã«ãããŸããæåã®éšåãšæ¬¡ã®éšåã§ãã ãããã£ãŠããã®é
眮ã®ãããã§ã1ãã€ãã®å€æ°ã¯4ãŸãã¯8ãã€ããåããŸãã 以äžã«äŸã瀺ããŸãã
#include <stdio.h> class Foo { int a; char b; int c; char d; }; class Bar { int a; int c; char b; char d; }; int main() { printf( "%d - %d\n", sizeof(Foo), sizeof(Bar) ); return 0; }
ç§ã®ãã·ã³ã§ã¯ãåºåã¯æ¬¡ã®ããã«ãªããŸãã
$ g++ test.cpp && ./a.out 16 - 12
ã¢ã©ã€ã¡ã³ãã¯4ãã€ãã®å¢çã«æ²¿ã£ãŠå®è¡ãããããšãããããŸãã ãããŠããŸã£ããåãã¯ã©ã¹ã®
Foo
ãš
Bar
ã¯ãã¡ã¢ãªå
ã§ç°ãªããµã€ãºãå æããŸãã éåžžãããã¯ç¡èŠã§ããŸãã ãã ããã¯ã©ã¹ã®æ°åã®ã€ã³ã¹ã¿ã³ã¹ãäœæããå Žåã¯ã
Bar
ãªãã·ã§ã³ãé©ããŠããŸãã ãã¡ãããã³ã³ãã€ã©èªäœã«ã¯å€æ°ãåé
眮ããæš©å©ã¯ãããŸããã
ãã¡ãããã§ããã ãå¯ã«ããã¯ããããã«ãåå€æ°ã®ãµã€ãºãèšç®ããªãã§ãã ããã å€æ°ã®ãµã€ãºã¯ãã³ã³ãã€ã©ãã³ã³ãã€ã«ãªãã·ã§ã³ãããã³ã¢ãŒããã¯ãã£ã«ãã£ãŠç°ãªãå ŽåããããŸãã ãŸããæŽåã¯ãå®éã®å¿
èŠãªãã«æå¶ãããã¹ãã§ã¯ãããŸããã
3.ãã«ãã¹ã¬ãã
ãã«ãã¹ã¬ããã³ãŒããæžãããšã¯ãåæãªããžã§ã¯ããæ£ããå Žæã«é
眮ããããšã§ã¯ãªããåæãå¿
èŠãšããªãã³ãŒããæžãããšã«ããããšãç¥ã£ãŠããããšãéèŠã§ãã
3.1ã ååæäœ
äžè¬ã«ãã«ãŒãã«ãžã®ã»ãšãã©ãã¹ãŠã®ã¢ã¯ã»ã¹ã¯é«äŸ¡ãªæäœã§ãã ã¡ã¢ãªãšä»ã®å€ãã®èª²é¡ã®äž¡æ¹ã ãã®ãããªããã°ã©ã ã®åŒã³åºããå°ãªãã»ã©ãããè¯ãçµæãåŸãããŸãã åæã®å Žåãè¿œå ã®ãªãŒããŒãããã«ããã競åãããšãã«ã³ã³ããã¹ããåãæ¿ããå¿
èŠãçããŸãã ãããã£ãŠãå€ãã®ç«¶åãããããã¥ãŒããã¯ã¹/ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã䜿çšããŠåæãå®è¡ãããå ŽåããªãŒããŒãããã¯éåžžã«æ·±å»ã«ãªãå¯èœæ§ããããŸãã ãããŠã競äºãæ¿ãããªãã°ãªãã»ã©ã圌ãã¯å€§ãããªããŸãã 以äžã¯ãããªãããç¥ãããŠããããã°ã©ã ïŒå·çæç¹ïŒã®LinuxDC ++ / StrongDC ++ããã³ããããåãã³ãŒãã«åºã¥ããä»ã®åæ§ã®ããã°ã©ã ã®äžè¯ã³ãŒãã®äŸã§ãã
static long safeInc(volatile long& v) { pthread_mutex_lock(&mtx); long ret = ++v; pthread_mutex_unlock(&mtx); return ret; } static long safeDec(volatile long& v) { pthread_mutex_lock(&mtx); long ret = --v; pthread_mutex_unlock(&mtx); return ret; } static long safeExchange(volatile long& target, long value) { pthread_mutex_lock(&mtx); long ret = target; target = value; pthread_mutex_unlock(&mtx); return ret; }
ãã®ã³ãŒãã¯ãLinuxã§ã®ã¢ã»ã³ããªçšã«ã³ã³ãã€ã«ãããŠããŸãã ãã ããWindowsã®å Žåãã³ãŒãã¯æ£ããã§ãã
static long safeInc(volatile long& v) { return InterlockedIncrement(&v); } static long safeDec(volatile long& v) { return InterlockedDecrement(&v); } static long safeExchange(volatile long& target, long value) { return InterlockedExchange(&target, value); }
éãã¯ãLinuxã§ã¯ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã䜿çšãããWindowsã§ã¯éãmutexãå¿
èŠãšããªãã¢ãããã¯æäœã䜿çšãããããšã§ãã
3.2ã ãã£ãã·ã¥ã©ã€ã³
ã¡ã¢ãªã®çãééã®é åãžã®ç°ãªãã¹ã¬ããã®ã¢ã¯ã»ã¹ãèš±å¯ããªãããã«ããŠãã ããã ããšãã°ã次ã®ãããªæ§é ããããŸãã
struct Shared { int a; int b; int c; };
å€æ°ã®1ã€ã«ã¢ã¯ã»ã¹ããã¹ã¬ããã ã¹ã¬ãããç°ãªãã³ã¢ã§å®è¡ããããšã
ãã£ãã·ã¥ã©ã€ã³ãã³ãã³ãšåŒã°ããã€ãã³ããçºçããŸãã2ã€ã®ç°ãªãã³ã¢ãäºãã®å€æŽã確èªããå¿
èŠãããå Žåããã£ãã·ã¥ããã©ãã·ã¥ããRAMããããŒã¿ãèŠæ±ããå¿
èŠããããŸãã ãã®ãããªå Žåãã¹ã¬ãããå
±æããŒã¿ãå¿
èŠãšãããšããããã»ããµã®
Cache-Lineã«é©åããå€æ°ã®éã«ã¡ã¢ãªãæ¿å
¥ããå¿
èŠããããŸãã é£ç¹ã¯ãåããã»ããµã®ãã®
ãã£ãã·ã¥ã©ã€ã³ã®ãµã€ãºãç°ãªãããšã§ãã 128ãã€ãã®å€ã«çŠç¹ãåœãŠãŸãã
struct Shared { int a; char pad1[128]; int b; char pad2[128]; int c; };
4.ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã
ããã¯ããã䜿çšãããæ©èœãç解ããŠããå Žåã«ã®ã¿ãäžããã¹ãã¬ãã«ã§ãã ãã©ããã¯ãæãäºæããªãå Žæã«æœãå¯èœæ§ããããŸãã
4.1ã èšæ¶
é »ç¹ãªã¡ã¢ãªå²ãåœãŠãé¿ããããã«ããŠãã ããã ããã¯éåžžã«é«äŸ¡ãªæäœã§ãã ãŸããã100 MBãå²ãåœãŠãããšã1 MBãå²ãåœãŠããã®éãã¯ãããã§ãã ãããã£ãŠãOSã«ãŒãã«ã«ã¢ã¯ã»ã¹ããã«å€§éã®ã¡ã¢ãªãäºåã«å²ãåœãŠãŠäœ¿çšããããã«ãã³ãŒããæŽçããå¿
èŠããããŸãã
ã¡ã¢ãªãé »ç¹ã«å²ãåœãŠãå¿
èŠãããå Žåãç¹ã«äžŠåã¹ã¬ããããã®ã¢ã¯ãã£ããªã¡ã¢ãªæäœã®å Žåãæšæºã©ã€ãã©ãªã«çµã¿èŸŒãŸããã¢ãã±ãŒã¿ã¯å¹çãæªãããšã«æ³šæããŠãã ããã
nedmallocã
TCMallocãªã©ã®ä»£æ¿ã¢ãã±ãŒã¿ãŒããŸãã¯
Boost.Poolãªã©ã®ã¡ã¢ãªããŒã«ã®äœ¿çšãæ€èšããŠãã ããã
4.2ã I / Oãããã¡ãªã³ã°
read/write
ã
ReadFile/WriteFile
ãªã©ã®ã·ã¹ãã ã³ãŒã«ã¯ããããã¡ãªã³ã°ã䜿çšããŸããã ãããã£ãŠã1ãã€ããèªã¿åããšãããŒã¿ã®ãããã¯å
šäœãèªã¿åããããããã1ãã€ããè¿ãããŸãã 次ã®ãã€ããèªã¿åããšããåããããã¯ã®èªã¿åããåã³è¡ãããŸãã åæ§ã«ãæžã蟌ã¿æïŒ1ãã€ããæžã蟌ããšããã®ãã€ããããã«æžã蟌ãŸããŸãã éåžžã«éå¹ççã§ãã ãããã£ãŠãããšãã°
fread/fwrite
ãªã©ã®ãããã¡ãªã³ã°ãæäŸããé¢æ°ã䜿çšããå¿
èŠããããŸãã
5.ããã»ããµãŒ
5.1ã RAMã¯ãã¯ãRAMã§ã¯ãããŸãã
RAMã¯ã©ã³ãã ã¢ã¯ã»ã¹ã¡ã¢ãªã®ç¥ã§ãã ãã ãããããŸã§ã®ãšãããRAMãé«éã©ã³ãã ã¢ã¯ã»ã¹ã®ãœãŒã¹ãšããŠäœ¿çšããããšããŠããè¯ãçµæã«ã¯ãªããŸããã ã¡ã¢ãªãžã®ã¢ã¯ã»ã¹ã«ã¯ãããã»ããµã®æ°çŸã¯ããã¯ãµã€ã¯ã«ãå¿
èŠã ããã§ãïŒ
ç¯çŽã§ããã®ã¯ããã»ããµãã£ãã·ã¥ã®ã¿ã§ããããã»ããµãã£ãã·ã¥ãžã®ã¢ã¯ã»ã¹ã«ã¯ãçŽ12ã¯ããã¯ãµã€ã¯ã«ïŒ
source ïŒããããŸãã ãã®ããšãããå¿
èŠãªãã¹ãŠã®ããŒã¿ãããã»ããµãã£ãã·ã¥ã«é
眮ãããããã«ããå¿
èŠããããŸãã ããã¯ããã°ã©ã ã®ããŒã¿ã ãã§ãªããã³ãŒãèªäœã§ããããŸãã å¯èœã§ããã°ãã¡ã¢ãªãžã®é 次ã¢ã¯ã»ã¹ã䜿çšããŸãã ããã·ã¥ããŒãã«ãé£æ³æ§é ãªã©ã®æ§é ãæŽçããå Žåãæ倧æ°ããã£ãã·ã¥ã«åãŸãããã«ãããŒã«äžèŠãªæ
å ±ãå«ããªãã§ãã ããã
5.2ã 眲åæžã¿ãæªçœ²åãïŒ
ã»ãšãã©ã®å Žåãããã°ã©ãã¯å€æ°ã«çœ²åããå¿
èŠããããã©ãããèããŸããã ããšãã°ãæååã®é·ã-äœããä»ã®å€ãã®å€ã®ééãäŸ¡æ Œã®ããã«ãè² ã®å€ã«ããããšã¯ã§ããŸããã ããããã笊å·çªå·ã®å€ã®ç¯å²ã¯ç®çã®å€ãæ ŒçŽããã«ã¯ååã§ãããããã»ããµã®åœä»€ã«ã¯ãŸã éãããããŸãã ããšãã°ããã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
int func(int i) { return i / 4; }
ã§æŸéãããŸã
lea eax, [rdi+3] test edi, edi cmovns eax, edi sar eax, 2
ãããŠããã¯ïŒ
unsigned int func(unsigned int i) { return i / 4; }
ã¯ããã«çããªãïŒ
mov eax, edi shr eax, 2
笊å·ãªãã®æ°å€ãåªå
ãããå
žåçãªå ŽæïŒé€ç®ãšä¹ç®ãã«ãŒãå
ã®ã«ãŠã³ã¿ãŒãé
åã®ã€ã³ããã¯ã¹ã
æµ®åå°æ°ç¹ããŒã¿åã¯ç¬Šå·ãªãã«ã§ããŸããã ãã ããç¹å¥ãªããã»ããµã³ãã³ãã䜿çšããŸãã
5.3ã æ
ãããã£ãŠãããã»ããµãã€ãã©ã€ã³ã¯ãã€ãã©ã€ã³ãšåŒã°ããã³ãã³ãã®é£ç¶ã¹ããªãŒã ãåŠçããŸãã ããã»ããµã¯ãã³ãã³ãããã³ã¹ãããã§ãã€ãã©ã€ã³ã«é
ä¿¡ãããããããã³ãã³ããå®è¡ããåŸãããã«å¥ã®ã³ãã³ãã®åŠçãéå§ããŸãã ãã ããåå²ãçºçããå Žåãã€ãŸã
if
...
else
ã®æ¡ä»¶ã§ã¯ãããã»ããµã¯
if
ãŸãã¯
else
ã³ãã³ãã䜿çšããåå²ãèªèããŸã
else
ã ãããã£ãŠã圌ã¯ã©ã¡ãã䜿çšãããããäºæž¬ããããšããŠããŸãã äºæž¬ã§ãšã©ãŒãçºçããå Žåããã€ãã©ã€ã³ãã¢ã€ãã«ç¶æ
ã®ãšãã«ããã€ãã©ã€ã³ããŒã¿ããã³ãããŠæ°ããã³ãã³ããããŒãããå¿
èŠããããŸãã
ããã¯ãåå²äºæž¬åãããã°ã©ã ãå®è¡ããåå²ãããæ©ãç解ããã»ã©ããã€ãã©ã€ã³ããããããããå¯èœæ§ãäœããªãããšãæå³ããŸãã éåžžãæãå¯èœæ§ã®é«ããã©ã³ããæåã«ïŒã€ãŸããifæ¡ä»¶ã«ïŒé
眮ããããšããå§ãããŸãã
6.çµè«
ãã®ããããã®èšäºã§ã¯ãC ++ã³ãŒããæé©åããããã€ãã®æ¹æ³ãæ€èšããŸããã ãããã®ããã€ããããªãã«ãšã£ãŠåœ¹ã«ç«ã€ããšãé¡ã£ãŠããŸãã èšäºã«èšèŒãããŠããªãä»ã®æ¹æ³ãç¥ã£ãŠããå Žåã¯ãã³ã¡ã³ãã«æžããŠãã ããïŒ
æåŸã«ãããã«2ã€ã®ãã³ãã瀺ããŸãã
- æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ãåªå
ããŸãã 圌ãã¯ãã§ã«æ€èšŒãããŠããã圌ãã®ãµããŒããšæŽç·Žã«æéã浪費ããå¿
èŠã¯ãããŸããã圌ãã¯ä»ã®äººã
ã®åã«ãã£ãŠçºå±ãä¿®æ£ããŸãã èªè»¢è»ã®çºæã¯ãèªå·±éçºã«ã¯éåžžã«åªããŠããŸãããéå£éçºã«ã¯éåžžã«æªãã§ãã
- é«éã§ã¯ãªããã·ã³ãã«ã§ããããããã³ãŒããäœæããæ¹æ³ã«ã€ããŠãã£ãšèããŠãã ããã ã³ãŒãã®ã·ã³ãã«ããã¯ããã«éèŠã§ãã