å€ãã®ããã°ã©ããŒã¯ãCããã³C ++ã®ããã°ã©ã ãéåžžã«é·ãéç¶ããŠããããšãçŽæ¥ç¥ã£ãŠããŸãã 誰ããéäŒäžã«å£ãšæŠãããšã§ãã®åé¡ã解決ãã誰ãããããã³ã«è¡ã£ãŠãã³ãŒããŒã飲ããããšã§è§£æ±ºããŸãã ãã®èšäºã¯é£œã飜ãããŠãã人ã®ããã®ãã®ã§ã圌ã¯äœããããæã ãšå€æããŸããã ãã®èšäºã§ã¯ããããžã§ã¯ãã®ã¢ã»ã³ããªãå éããããã®ããŸããŸãªæ¹æ³ãšãã1ã€ã®ããããŒãã¡ã€ã«ãä¿®æ£-ãããžã§ã¯ãã®ååãåæ§ç¯ãããããšããç
æ°ã®æ²»çã«ã€ããŠåæããŸãã
äžè¬åå
å§ããåã«ãC / C ++ã³ãŒããå®è¡å¯èœããã°ã©ã ã«å€æããäž»ãªæ®µéãèŠã€ããŠæãåºããŠã¿ãŸãããã
N1548ãã©ãããããã°ã©ãã³ã°èšèª-Cãã®5.1.1.2ç¯ããã³N4659ãã©ãããWorking Draftãããã°ã©ãã³ã°èšèªC ++ã®æšæºãã®ç¯ïŒæšæºã®å
¬éããŒãžã§ã³ã¯
ãããš
ããã§è³Œå
¥ã§ããŸãïŒã«åŸã£ãŠã8段éãš9段éã®ç¿»èš³ãããããå®çŸ©ãããŠããŸãã 詳现ãçç¥ããŠã翻蚳ããã»ã¹ãæœè±¡çã«èŠãŠã¿ãŸãããã
- ãã§ãŒãºI-ãœãŒã¹ãã¡ã€ã«ã¯ããªããã»ããµã®å
¥åã«éãããŸãã ããªããã»ããµã¯ãïŒincludeã§æå®ããããã¡ã€ã«ã®å
容ã®çœ®æãè¡ãããã¯ããå±éããŸãã ãã©ããC11ããã³C ++ 17ã®ãã§ãŒãº1ãã4ã«å¯Ÿå¿ããŸãã
- ãã§ãŒãºII-ååŠçããããã¡ã€ã«ã¯ã³ã³ãã€ã©ãŒå
¥åã«å°çãããªããžã§ã¯ãã«å€æãããŸãã ãã©ããC11ã®ãã§ãŒãº5ã7ããã³ãã©ããC ++ 17ã®5ã8ã«å¯Ÿå¿ããŸãã
- ãã§ãŒãºIII-ãªã³ã«ãŒã¯ãªããžã§ã¯ããã¡ã€ã«ãšæäŸãããéçã©ã€ãã©ãªããªã³ã¯ããå®è¡å¯èœããã°ã©ã ã圢æããŸãã ãããããã©ããC11ããã³C ++ 17ã®ãã§ãŒãº8ããã³9ã«å¯Ÿå¿ããŸãã
ããã°ã©ã ã¯ç¿»èš³åäœïŒ* .cã* .ccã* .cppã* .cxxïŒã§æ§æãããŠããããããããèªçµŠèªè¶³ã§ãããäºãã«ç¬ç«ããŠååŠç/ã³ã³ãã€ã«ã§ããŸãã ãã®ããšãããå翻蚳åäœã«ã¯ä»ã®åäœã«é¢ããæ
å ±ããªãããšã«ããªããŸãã 2ã€ã®ç¿»èš³åäœãäœããã®æ
å ±ïŒé¢æ°ãªã©ïŒã亀æããå¿
èŠãããå Žåãååã§ãªã³ã¯ããããšã§ããã解決ããŸããå€éšãšã³ãã£ãã£ã¯
externããŒã¯ãŒãã§å®£èšããããã§ãŒãºIIIã§ã¯ãªã³ã«ãŒãããããæ¥ç¶ããŸãã ç°¡åãªäŸã
TU1.cppãã¡ã€ã«ïŒ
TU2.cppãã¡ã€ã«ïŒ
ããŸããŸãªç¿»èš³åäœã®èª¿æŽãç°¡çŽ åããããã«ãããããŒãã¡ã€ã«ã¡ã«ããºã ãçºæãããæç¢ºãªã€ã³ã¿ãŒãã§ã€ã¹ã®å®£èšã§æ§æãããŸããã ãã®åŸãå¿
èŠã«å¿ããŠãå翻蚳åäœã«
#includeããªããã»ããµãã£ã¬ã¯ãã£ãã䜿çšããŠããããŒãã¡ã€ã«ãå«ãŸããŸãã
次ã«ãããŸããŸãªæ®µéã§ã¢ã»ã³ããªãé«éåããæ¹æ³ãæ€èšããŸãã ååèªäœã«å ããŠãã¢ã»ã³ããªã·ã¹ãã ã§ãã®ã¡ãœãããŸãã¯ãã®ã¡ãœãããå®è£
ããæ¹æ³ã説æããããšã圹ç«ã¡ãŸãã æ¬¡ã®ãã«ãã·ã¹ãã ã®äŸã瀺ããŸãïŒ
MSBuild ã
Make ã
CMake ã
ã³ã³ãã€ã«ã®äŸåé¢ä¿
ã³ã³ãã€ã«æã®äŸåé¢ä¿ã¯ãC / C ++ãããžã§ã¯ãã®ãã«ãéåºŠã«æã圱é¿ãäžãããã®ã§ãã
#includeããªããã»ããµãã£ã¬ã¯ãã£ãã䜿çšããŠããããŒãã¡ã€ã«ãã€ã³ã¯ã«ãŒããããã³ã«çºçããŸãã ãã®å Žåãã©ã®ãšã³ãã£ãã£ã«ãã¢ããŠã³ã¹ã®ãœãŒã¹ã¯1ã€ãããªããšæãããŸãã çŸå®ã¯çæ³ãšã¯ã»ã©é ã-ã³ã³ãã€ã©ã¯ç°ãªã翻蚳åäœã§åãåºåãç¹°ãè¿ãåŠçããå¿
èŠããããŸãã ãã¯ãã¯ããã«ç»åãå°ç¡ãã«ããŸããããããŒãã€ã³ã¯ã«ãŒããããããã¯ã宣èšã远å ããŸãããã®å
å®¹ã¯æ ¹æ¬çã«å€ããå¯èœæ§ãããããã§ãã
äŸåé¢ä¿ã®æ°ãæžããããã€ãã®æ¹æ³ãèŠãŠã¿ãŸãããã
æ¹æ³N1ïŒæªäœ¿çšã®å
å«ç©ãåé€ââããŸãã 䜿çšããŠããªããã®ã«æ¯æãå¿
èŠã¯ãããŸããã ãããã£ãŠãããªããã»ããµãšã³ã³ãã€ã©ã®äž¡æ¹ã®äœæ¥ãåæžããŸãã ããããŒ/ãœãŒã¹ãã¡ã€ã«ãæåã§ãã·ã£ãã«ãããããæ¬¡ã®ãŠãŒãã£ãªãã£ã䜿çšã§ããŸãïŒ
include-what-you-use ã
ReSharper C ++ ã
CppClean ã
Doxygen + Graphviz ïŒå
å«å³ãèŠèŠåããããïŒãªã©ã
æ¹æ³N2ïŒå®çŸ©ã§ã¯ãªãã宣èšãžã®äŸåé¢ä¿ã䜿çšããŸãã 2ã€ã®äž»ãªåŽé¢ãåºå¥ããŸãã
1ïŒãªã³ã¯ãŸãã¯ãã€ã³ã¿ãŒã䜿çšã§ããããããŒãã¡ã€ã«ã§ãªããžã§ã¯ãã䜿çšããªãã§ãã ããã ãªã³ã¯ãšãã€ã³ã¿ãŒã®å Žåãã³ã³ãã€ã©ãŒã¯ãªã³ã¯/ãã€ã³ã¿ãŒã®ãµã€ãºïŒãã©ãããã©ãŒã ã«å¿ããŠ4ãŸãã¯8ãã€ãïŒãèªèãã転éããããªããžã§ã¯ãã®ãµã€ãºã¯éèŠã§ã¯ãªããããå
é ã®å®£èšã§ååã§ãã ç°¡åãªäŸïŒ
ããã§ãæåã®ããããŒã倿Žãããšãã³ã³ãã€ã©ãŒã¯
Foo.hãš
Bar.hã®äž¡æ¹ã«äŸåãã翻蚳åäœãåã³ã³ãã€ã«ãã
å¿
èŠããã
ãŸãããã®ãããªæ¥ç¶ãè§£é€ããã«ã¯ãå€ã«ãã£ãŠ
objãªããžã§ã¯ããæž¡ãããšãæåŠãã
Bar.hããããŒã®ãã€ã³ã¿ãŒãŸãã¯ãªã³ã¯ã§æž¡ãããšãåªå
ããŸãã
æšæºããããŒã«ã€ããŠã¯ãããã§å¿é
ããå¿
èŠã¯ãªããå¿
èŠã«å¿ããŠããããŒãã¡ã€ã«ã«å«ããã ãã§ãã å¯äžã®äŸå€ã¯
iostreamã§ãã ãã®ããããŒãã¡ã€ã«ã®ãµã€ãºã¯éåžžã«å€§ãããªã£ãŠããããã
iosfwdããããŒãä»å±ããŠããŸããããã«ã¯ãå¿
èŠãªãšã³ãã£ãã£ã®äž»èŠãªå®£èšã®ã¿ãå«ãŸããŠããŸãã ãããããããŒãã¡ã€ã«ã«å«ãŸããã¹ããã®ã§ãã
2ïŒ
PimplãŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®ã€ãã£ãªã ã䜿çšããŸãã Pimplã¯ããã€ã³ã¿ãŒãä»ããŠãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ã§ããå¥ã®ã¯ã©ã¹ã«å®è£
ã®è©³çްãé
眮ããããšã«ãããå®è£
ã®è©³çްãåé€ããŸãã 2çªç®ã®ã¢ãããŒãã¯ãæœè±¡åºæ¬ã¯ã©ã¹ã®äœæã«åºã¥ããŠããããã®å®è£
ã®è©³çްã¯ãçŽç²ãªä»®æ³é¢æ°ããªãŒããŒã©ã€ãããæŽŸçã¯ã©ã¹ã«è»¢éãããŸãã ã©ã¡ãã®ãªãã·ã§ã³ããã³ã³ãã€ã«æ®µéã§äŸåé¢ä¿ãæé€ããŸãããããã°ã©ã ã®å®è¡äžã®ãªãŒããŒãããã«ãå¯äžããŸããã€ãŸããåçãªããžã§ã¯ãã®äœæãšåé€ã鿥ã¢ãã¬ã¹æå®ã¬ãã«ã®è¿œå ïŒãã€ã³ã¿ãŒã«ããïŒã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®å Žåã¯å¥ã«-ä»®æ³é¢æ°ãåŒã³åºãã³ã¹ãã
æ¹æ³N3ïŒãªãã·ã§ã³ïŒïŒããã«ãäž»èŠãªåºåã®ã¿ãå«ãããããŒãäœæã§ããŸãïŒ
iosfwdã«é¡äŒŒïŒã ãããã®ãäž»èŠãªãããããŒã¯ãä»ã®éåžžã®ããããŒã«å«ããããšãã§ããŸãã
䞊åã³ã³ãã€ã«
æšæºçãªã¢ãããŒãã§ã¯ãã³ã³ãã€ã©ã¯ååŠçãšã³ã³ãã€ã«ã®ããã«äœåºŠãæ°ãããã¡ã€ã«ãåãåããŸãã å翻蚳åäœã¯èªçµŠèªè¶³ã§ãããããé«éåããè¯ãæ¹æ³ã¯ãäžåºŠã«Nåã®ãã¡ã€ã«ãåŠçããªãããI-II翻蚳ã®ãã§ãŒãºã䞊ååããããšã§ãã
Visual Studioã§ã¯ããããžã§ã¯ãã¬ãã«ã®
/ MP [processMax]ãã©ã°ã«ãã£ãŠã¢ãŒããæå¹ã«ãªããŸã
ãprocessMaxã¯ãã³ã³ãã€ã«ããã»ã¹ã®æå€§æ°ãå¶åŸ¡ãããªãã·ã§ã³ã®åŒæ°ã§ãã
makeã¢ãŒãã§ã¯ã
-jNãã©ã°
ããªã³ã«ãªããŸã
ãNã¯ã³ã³ãã€ã«ããã»ã¹ã®æ°ã§ãã
CMakeã䜿çšããå ŽåïŒããã³ã¯ãã¹ãã©ãããã©ãŒã éçºã§ãïŒã-
Gãã©ã°ã䜿çšããŠã
ãã«ãã·ã¹ãã ã®åºç¯ãªãªã¹ãçš
ã®ãã¡ã€ã«ãçæã§ããŸãã ããšãã°ãCMakeã¯ãC ++ã¢ãã©ã€ã¶ãŒPVS-Studioçšã®WindowsçšVisual Studioããã³LinuxçšUnix Makefileã®ãœãªã¥ãŒã·ã§ã³ãçæããŸãã CMakeãVisual Studioãœãªã¥ãŒã·ã§ã³ã§
/ MPãã©ã°ã䜿çšããŠãããžã§ã¯ããçæããã«ã¯ã
CMakeLists.txtã«æ¬¡ã®è¡ã远å ããŸãã
if (MSVC) target_compile_options(target_name /MP ...) endif()
ãŸããCMakeïŒããŒãžã§ã³2.8.0以éïŒãä»ããŠã䞊åãã©ã°ã䜿çšããŠã¢ã»ã³ããªã·ã¹ãã ãåŒã³åºãããšãã§ããŸãã MSVCïŒ/CMakeLists.txtã§æå®ããã
MP ïŒããã³NinjaïŒåæå®è¡ã¯æ¢ã«æå¹ã«ãªã£ãŠããŸãïŒã®å ŽåïŒ
cmake --build /path/to/build-dir
ã¡ã€ã¯ãã¡ã€ã«ã®å ŽåïŒ
cmake --build /path/to/build-dir -- -jN
忣ã³ã³ãã€ã«
åã®ãã³ãã䜿çšãããšãã¢ã»ã³ããªæéã倧å¹
ã«ççž®ã§ããŸãã ãã ãããããžã§ã¯ãã巚倧ãªå Žåãããã§ã¯ååã§ã¯ãªãå ŽåããããŸãã ã³ã³ãã€ã«ããã»ã¹ã®æ°ãå¢ãããšãããã»ããµ/ RAM /ãã£ã¹ã¯ã®æäœã«ãããåæã«ã³ã³ãã€ã«ããããã¡ã€ã«ã®æå€§æ°ãšãã圢ã§éå£ã«çŽé¢ããŸãã ããã§ã¯ãèåŸã®åå¿ã®ç¡æã®ãªãœãŒã¹ã䜿çšããŠã忣ã³ã³ãã€ã«ãå©ãã«ãªããŸãã ã¢ã€ãã¢ã¯ç°¡åã§ãïŒ
1ïŒ1ã€ã®ããŒã«ã«ãã·ã³ãŸãã¯äœ¿çšå¯èœãªãã¹ãŠã®ãã·ã³ã§ãœãŒã¹ãã¡ã€ã«ãååŠçããŸãã
2ïŒååŠçæžã¿ãã¡ã€ã«ãããŒã«ã«ãã·ã³ãšãªã¢ãŒããã·ã³ã§ã³ã³ãã€ã«ããŸãã
3ïŒä»ã®ãã·ã³ããã®çµæããªããžã§ã¯ããã¡ã€ã«ã®åœ¢åŒã§æåŸ
ããŸãã
4ïŒãªããžã§ã¯ããã¡ã€ã«ãäœæããŸãã
5�???
6ïŒå©çïŒ
忣ã³ã³ãã€ã«ã®äž»ãªæ©èœã匷調ããŸãã
- ã¹ã±ãŒã©ããªãã£-ç§ãã¡ã¯è»ãåŒã£æããŠãä»ã§ã¯çµã¿ç«ãŠã«åœ¹ç«ã¡ãŸãã
- 忣ã³ã³ãã€ã«ã®æå¹æ§ã¯ããããã¯ãŒã¯ãšåãã·ã³ã®ããã©ãŒãã³ã¹ã«äŸåããŸãã åãã·ã³ã®åæ§ã®ããã©ãŒãã³ã¹ã匷ããå§ãããŸãã
- ãã¹ãŠã®ãã·ã³ïŒã³ã³ãã€ã©ãŒãã©ã€ãã©ãªãŒãªã©ã®ããŒãžã§ã³ïŒã«åäžã®ç°å¢ãå¿
èŠã§ãã ããã¯ããã¹ãŠã®ãã·ã³ã§ååŠçãè¡ãããå Žåã«ç¹ã«å¿
èŠã§ãã
æãæåãªä»£è¡šè
ã¯æ¬¡ã®ãšããã§ãã
Linuxã§ã¯ãdistccãšIcecreamãããã€ãã®æ¹æ³ã§ç°¡åã«çµ±åã§ããŸãã
1ïŒã·ã³ããªãã¯ãªã³ã¯ïŒsymlinkïŒãä»ãããŠãããŒãµã«
mkdir -p /opt/distcc/bin # /opt/icecc/bin ln -s /usr/bin/distcc /opt/distcc/bin/gcc ln -s /usr/bin/distcc /opt/distcc/bin/g++ export PATH=/opt/distcc/bin:$PATH
2ïŒCMakeã®å ŽåãããŒãžã§ã³3.4以é
cmake -DCMAKE_CXX_COMPILER_LAUNCHER=/usr/bin/distcc /path/to/CMakeDir
ã³ã³ãã€ã©ãŒãã£ãã·ã¥
ãã«ãæéãççž®ãããã1ã€ã®æ¹æ³ã¯ãã³ã³ãã€ã©ãã£ãã·ã¥ã䜿çšããããšã§ãã ã³ãŒã倿ã®ãã§ãŒãºIIãå°ã倿ŽããŸãããã
çŸåšããã®å
容ãã³ã³ãã€ã«ãã©ã°ãã³ã³ãã€ã©åºåã«åºã¥ããŠååŠçããããã¡ã€ã«ãã³ã³ãã€ã«ãããšãã«ãããã·ã¥å€ãèšç®ãããŸãïŒã³ã³ãã€ã«ãã©ã°ãèæ
®ã«å
¥ããŸãïŒã ãã®åŸãããã·ã¥å€ãšããã«å¯Ÿå¿ãããªããžã§ã¯ããã¡ã€ã«ãã³ã³ãã€ã©ãã£ãã·ã¥ã«ç»é²ãããŸãã 倿ŽãããŠããªããã¡ã€ã«ã®åããã©ã°ã䜿çšããŠåã³ã³ãã€ã«ãããšãæ¢è£œã®ãªããžã§ã¯ããã¡ã€ã«ããã£ãã·ã¥ããååŸããããªã³ã«ãŒå
¥åã«éãããŸãã
䜿çšã§ãããã®ïŒ
- Unixã©ã€ã¯ã®å ŽåïŒ ccache ïŒGCCãClangïŒã cachecc1 ïŒGCCïŒã
- Windowsã®å ŽåïŒ clcache ïŒMSVCïŒã cclash ïŒMSVCïŒã
ccacheãåŸã§äœ¿çšããããã«ç»é²ããã«ã¯ãããã€ãã®æ¹æ³ããããŸãã
1ïŒã·ã³ããªãã¯ãªã³ã¯ãä»ãããŠãããŒãµã«
mkdir -p /opt/ccache/bin ln -s /usr/bin/ccache /opt/ccache/bin/gcc ln -s /usr/bin/ccache /opt/ccache/bin/g++ export PATH=/opt/ccache/bin:$PATH
2ïŒCMakeã®å ŽåãããŒãžã§ã³3.4以é
cmake -DCMAKE_CXX_COMPILER_LAUNCHER=/usr/bin/ccache /path/to/CMakeDir
ã³ã³ãã€ã©ãã£ãã·ã¥ã¯ã忣ã³ã³ãã€ã«ã«çµ±åããããšãã§ããŸãã ããšãã°ãdistcc / Icecreamã§ccacheã䜿çšããã«ã¯ãæ¬¡ã®æé ãå®è¡ããŸãã
1ïŒ
CCACHE_PREFIX倿°ãèšå®ããŸãã
export CCACHE_PREFIX=distcc # icecc
2ïŒccacheç»é²ã®ãã€ã³ã1-2ã®ããããã䜿çšããŸãã
ããªã³ã³ãã€ã«æžã¿ããããŒãã¡ã€ã«
倿°ã®ãœãŒã¹ãã¡ã€ã«ãã³ã³ãã€ã«ããå Žåãå®éã«ã¯ãã³ã³ãã€ã©ã¯åããžã§ããäœåºŠãå®è¡ããŠãéãããããŒïŒ
iostreamãªã© ïŒãè§£æããŸãã äž»ãªã¢ã€ãã¢ã¯ããããã®éãããããŒãåå¥ã®ãã¡ã€ã«ïŒéåžžã¯ãã¬ãã£ãã¯ã¹ããããŒãšåŒã°ããïŒã«é
眮ããããšã§ãããã¡ã€ã«ã¯äžåºŠã³ã³ãã€ã«ããã
æåã«ãã¹ãŠã®ç¿»èš³åäœ
ã«å«ãŸããŸãã
MSVCã§ã¯ãããªã³ã³ãã€ã«æžã¿ããããŒãäœæããããã«ã
stdafx.hããã³
stdafx.cpp ïŒä»ã®ååã䜿çšã§ããŸãïŒã®2ã€ã®ãã¡ã€ã«ãããã©ã«ãã§çæãããŸãã æåã®ã¹ãããã¯ã/
Yc 決å®ãã¹-stdafx.hãã©ã°ã䜿çšããŠ
stdafx.cppãã³ã³ãã€ã«ãã
ããš ã§ãã ããã©ã«ãã§ã¯ã
.pchãã¡ã€ã«ãäœæãããŸãã ãœãŒã¹ãã¡ã€ã«ã®ã³ã³ãã€ã«æã«ããªã³ã³ãã€ã«æžã¿ããããŒã䜿çšããã«ã¯ãflag /
Yudeterminedpath-to-stdafx.hã䜿çšããŸãã
/ Ycããã³
/ Yuãã©ã°ãšå
±ã«ã
/ Fp "path-to-pch"ã䜿çšããŠã
.pchãã¡ã€ã«ãžã®ãã¹ãæå®ããããšã
ã§ããŸãã ããã§ãå翻蚳åäœã®ãã¬ãã£ãã¯ã¹ããããŒãæåã®ããããŒã«æ¥ç¶ããå¿
èŠããããŸãã
#include "path-to-stdafx.h"ãçŽæ¥äœ¿çšãããã/
FIãã©ã¡ãŒã¿ãŒ path-to-stdafx.hãã©ã°
ã匷å¶çã«
䜿çšããŸã ã
GCC / Clangã§ã®ã¢ãããŒãã¯ã»ãšãã©ç°ãªããŸãããéåžžã®ã³ã³ãã€ã«æžã¿ãã¡ã€ã«ã§ã¯ãªãããã¬ãã£ãã¯ã¹ããããŒãã³ã³ãã€ã©ã«çŽæ¥æž¡ãå¿
èŠããããŸãã ã³ã³ãã€ã©ã¯ãããã©ã«ãã®
.gchæ¡åŒµåãæã€ããªã³ã³ãã€ã«æžã¿ããããŒãèªåçã«çæããŸãã -xã¹ã€ããã䜿çšãããšãããã«
c-headerãŸãã¯
c ++-headerãšããŠæ±ããã©ãããæå®ã§ããŸãã
#includeãŸãã¯
-includeãã©ã°ã䜿çšããŠãæåã§ãã¬ãã£ãã¯ã¹ããããŒãå«ããŸãã
ããªã³ã³ãã€ã«æžã¿ããããŒã®
詳现ã«ã€ããŠã¯ã
ãã¡ããã芧ãã ãã ã
CMakeã䜿çšããå Žåã¯ã
cotireã¢ãžã¥ãŒã«ã詊ãããšããå§ãããŸãããœãŒã¹ãã¡ã€ã«ãèªåçã«åæãããã¬ãã£ãã¯ã¹ãšããªã³ã³ãã€ã«æžã¿ããããŒãçæããŠã翻蚳ãŠãããã«æ¥ç¶ã§ããŸãã ç¬èªã®ãã¬ãã£ãã¯ã¹ããããŒïŒããšãã°ã
stdafx.h ïŒãæå®ããããšãã§ããŸãã
ã·ã³ã°ã«ã³ã³ãã€ã«ãŠããã
ãã®ã¡ãœããã®æ¬è³ªã¯ãä»ã®ç¿»èš³åäœãå«ãåäžã®ã³ã³ãã€ã«æžã¿ãã¡ã€ã«ïŒç¿»èš³åäœïŒãäœæããããšã§ãïŒ
ãã¹ãŠã®ç¿»èš³åäœãåäžã®ã³ã³ãã€ã«æžã¿ãã¡ã€ã«ã«å«ãŸããŠããå Žåããã®æ¹æ³ã¯ãŠããã£ãã«ããšãåŒã°ããŸãã Single Compilation Unitã®äž»ãªæ©èœã以äžã«æããŸãã
- ã³ã³ãã€ã«ããããã¡ã€ã«ã®æ°ãèããæžå°ããããããã£ã¹ã¯æäœã®æ°ãæžå°ããŸãã ã³ã³ãã€ã©ã¯åããã¡ã€ã«ãã¯ããã«å°ãªãåŠçãããã³ãã¬ãŒããã€ã³ã¹ã¿ã³ã¹åããŸãã ããã¯ãã«ãæéã«èãã圱é¿ããŸãã
- ã³ã³ãã€ã©ã¯ããªã³ã«ã§å©çšå¯èœãªæé©åãå®è¡ã§ããããã«ãªããŸããïŒãªã³ã¯æéã®æé©å/ããã°ã©ã å
šäœã®æé©åïŒã
- ã·ã³ã°ã«ã³ã³ãã€ã«ãŠãããã®äžéšãšããŠåäžã®ãã¡ã€ã«ã倿Žãããšããã®åã³ã³ãã€ã«ãçºçãããããã€ã³ã¯ãªã¡ã³ã¿ã«ã¢ã»ã³ããªã¯ãããã«å£åããŸãã
- Unity Buildã䜿çšãããšã忣ã¢ã»ã³ããªã䜿çšã§ããªããªããŸãã
ã¢ãããŒããé©çšããéã«èµ·ããããåé¡ã«æ³šæããŸãã
- ODRéåïŒãã¯ãåãããŒã«ã«éç颿°ãã°ããŒãã«éç倿°ãå¿ååå空éã®å€æ°ã®äžèŽïŒã
- namespaceã䜿çšããŠäœ¿çšããããã®ååã®è¡çªã
ãã«ãã³ã¢ã·ã¹ãã ã®æå€§ã®å©ç¹ã¯ã次ã®ã¹ããŒã ãæäŸããããšã§ãã
- ããªã³ã³ãã€ã«æžã¿ããããŒã䜿çšããè€æ°ã®ã·ã³ã°ã«ã³ã³ãã€ã«ãŠãããã®äžŠåã³ã³ãã€ã«ã
- ã³ã³ãã€ã©ãã£ãã·ã¥ã䜿çšããè€æ°ã®ã·ã³ã°ã«ã³ã³ãã€ã«ãŠãããã®åæ£ã³ã³ãã€ã«ã
CMakeã䜿çšããå Žåã
ãã®ã¢ãžã¥ãŒã«ã§SCUçæãèªååã§ããŸãã
ãããŒããã£ã¹ãã³ã³ããŒãã³ãã®äº€æ
翻蚳ã³ã³ããŒãã³ãã®1ã€ãããé«éãªã¢ããã°ã«çœ®ãæãããšãã¢ã»ã³ããªé床ãåäžããŸãã ãã ããããã¯èªåã®è²¬ä»»ã§è¡ã£ãŠãã ããã
ããé«éãªã³ã³ãã€ã©ãšããŠã
Zapccã䜿çšã§ããŸãã èè
ã¯ããããžã§ã¯ãã®åã³ã³ãã€ã«ã®è€æ°ã®å éãçŽæããŸãã ããã¯
Boost.Mathãåã³ã³ãã€ã«ããäŸã§èŠãããšãã§ããŸãïŒ
Zapccã¯ããã°ã©ã ã®ããã©ãŒãã³ã¹ãç ç²ã«ããããšãªããClangã«åºã¥ããŠãããClangãšå®å
šã«äºææ§ããããŸãã
ããã§ã¯ãZapccãã©ã®ããã«æ©èœãããã確èªã§ããŸãã ãããžã§ã¯ããCMakeã«åºã¥ããŠããå Žåãã³ã³ãã€ã©ã®äº€æã¯éåžžã«ç°¡åã§ãã
export CC=/path/to/zapcc export CXX=/path/to/zapcc++ cmake /path/to/CMakeDir
ãŸãã¯ïŒ
cmake -DCMAKE_C_COMPILER=/path/to/zapcc \ -DCMAKE_CXX_COMPILER=/path/to/zapcc++ \ /path/to/CMakeDir
OSããªããžã§ã¯ããã¡ã€ã«ïŒUnixã®ãããªã·ã¹ãã ïŒã«ELF圢åŒã䜿çšããŠããå ŽåãGNU ldãªã³ã«ãŒãGNU goldã«çœ®ãæããããšãã§ããŸãã GNUãŽãŒã«ãã¯ãããŒãžã§ã³2.19ããbinutilsã«
ãã³ãã«ã
ããŠããã
-fuse-ld = goldãã©ã°ã§ã¢ã¯ãã£ãåãããŸãã CMakeã§ã¯ãããšãã°æ¬¡ã®ã³ãŒãã䜿çšããŠã¢ã¯ãã£ãåã§ããŸãã
if (UNIX AND NOT APPLE) execute_process(COMMAND ${CMAKE_CXX_COMPILER} -fuse-ld=gold -Wl,--version ERROR_QUIET OUTPUT_VARIABLE ld_version) if ("${ld_version}" MATCHES "GNU gold") message(STATUS "Found Gold linker, use faster linker") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=gold ") endif() endif()
SSD / RAMDiskã䜿çšãã
ã¢ã»ã³ããªã®æãããªããã«ããã¯ã¯ããã£ã¹ã¯æäœã®é床ïŒç¹ã«ã©ã³ãã ã¢ã¯ã»ã¹ïŒã§ãã ãããžã§ã¯ããŸãã¯ãã®äžæãã¡ã€ã«ãããé«éãªã¡ã¢ãªïŒã©ã³ãã ã¢ã¯ã»ã¹é床ãåäžããHDDãSSDãHDD / SSDããã®RAIDãRAMDiskïŒã«è»¢éãããšãç¶æ³ã«ãã£ãŠã¯éåžžã«åœ¹ç«ã¡ãŸãã
C ++ã®ã¢ãžã¥ã©ãŒã·ã¹ãã
äžèšã®æ¹æ³ã®ã»ãšãã©ã¯ãC / C ++èšèªã®ç¿»èš³ã®ååã®éžæã«ããæŽå²çã«çããŠããŸããã ããããŒãã¡ã€ã«ã®ã¡ã«ããºã ã¯ãèŠããã®åçŽãã«ãããããããC / C ++ããã°ã©ãã«ãšã£ãŠã¯å€ãã®åé¡ã§ãã
ããªãé·ãéãC ++æšæºã«ã¢ãžã¥ãŒã«ãå«ããããšã«ã€ããŠã®è°è«ããããŸããïŒãããŠãããããC ++ 20ã«ç»å Žããã§ãããïŒã
ã¢ãžã¥ãŒã«ã¯
ãã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ã€ã¹ãšåŒã°ããå€éšïŒãšã¯ã¹ããŒããããïŒååã®ç¹å®ã®ã»ãããæã€ç¿»èš³ãŠãããïŒ
ã¢ãžã¥ã©ãŒãŠããã ïŒã®é¢é£ã»ãããšèŠãªãã
ãŸã ã ã¢ãžã¥ãŒã«ã¯ãã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠ
ã®ã¿ã€ã³ããŒããããã¹ãŠã®ç¿»èš³ãŠãããã§äœ¿çšã§ããŸãã ãšã¯ã¹ããŒããããªãååã¯
ãã¢ãžã¥ãŒã«ã®å®è£
ã«é
眮ãã
ãŸã ã
ã¢ãžã¥ãŒã«ã®ãã1ã€ã®éèŠãªå©ç¹ã¯ãããããŒãã¡ã€ã«ãšã¯ç°ãªãããã¯ããããªããã»ããµãã£ã¬ã¯ãã£ãã«ãã£ãŠå€æŽãããªãããšã§ãã éããŸãçã§ããã¢ãžã¥ãŒã«å
ã®ãã¯ããšããªããã»ããµãã£ã¬ã¯ãã£ãã¯ããããã€ã³ããŒããã倿åäœã«åœ±é¿ããŸããã æå³çã«ã¯ãã¢ãžã¥ãŒã«ã¯ç¬ç«ãããå®å
šã«ã³ã³ãã€ã«ããã翻蚳åäœã§ãã
ãã®èšäºã§ã¯ãå°æ¥ã®ã¢ãžã¥ãŒã«ã®èšèšã«ã€ããŠã¯è©³ãã調ã¹ãŸããã ãããã«ã€ããŠè©³ããç¥ãããå Žåã¯ã
CppCon 2017ã§ã®C ++ã¢ãžã¥ãŒã«ã«é¢ããBoris
Kolpakovã®
ãã¬ãŒã³ããŒã·ã§ã³ã
ã芧ã«ãªãããšããå§ãããŸãïŒã¢ã»ã³ããªæéã®éãã瀺ãããŠããŸãïŒã
çŸåšãŸã§ã«ã
MSVC ã
GCC ã
Clangã³ã³ãã€ã©ã¯å®éšçãªã¢ãžã¥ãŒã«ãµããŒããæäŸããŠããŸãã
ãŸããPVS-Studioã¢ã»ã³ããªã«ã€ããŠäœããããŸããïŒ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ã説æããã¢ãããŒããã©ãã»ã©å¹æçã§æçšããèŠãŠã¿ãŸãããã
Cããã³C ++ã³ãŒããåæããããã®PVS-Studioã¢ãã©ã€ã¶ãŒã®ã³ã¢ãåãäžããŸãããã ãã¡ãããC ++ã§æžãããŠãããã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ã§ãã ã³ã¢ã¯ãLLVM / ClangãGCCãChromiumãªã©ã®å·šäººã«æ¯ã¹ãŠå°ããªãããžã§ã¯ãã§ãã ããšãã°ãã³ãŒãããŒã¹ã§CLOCãçæãããã®ã¯æ¬¡ã®ãšããã§ãã
---------------------------------------------------------------- Language files blank comment code ---------------------------------------------------------------- C++ 380 28556 17574 150222 C/C++ Header 221 9049 9847 46360 Assembly 1 13 22 298 ---------------------------------------------------------------- SUM: 602 37618 27443 196880 ----------------------------------------------------------------
äœæ¥ãè¡ãåã«ãäœæ¥ãã·ã³ã®æ¬¡ã®æ§æã§ãããžã§ã¯ãã1.5åã§ïŒäžŠåã³ã³ãã€ã«ãš1ã€ã®ããªã³ã³ãã€ã«æžã¿ããããŒã䜿çšããŠïŒçµã¿ç«ãŠãããããšã«æ³šæããŠãã ããã
- Intel Core i7-4770ããã»ããµãŒ3.4 GHzïŒ8 CPUïŒã
- RAM 16 Gb RAM DDR3-1333 MHz
- ã·ã¹ãã ãã©ã€ããšããŠã®Samsung SSD 840 EVO 250 Gbã
- WDC WD20EZRX-00D8PB0 2 Tbã¯äœæ¥ããŒãºã«å¯Ÿå¿ã
HDDã§ã®ãããžã§ã¯ãã®ã¢ã»ã³ããªãéå§ã€ã³ãžã±ãŒã¿ãšããŠæ¡çšããã¢ã»ã³ããªæéã®æé©åããã¹ãŠç¡å¹ã«ããŸãã æ¬¡ã«ã枬å®ã®ç¬¬1段éã瀺ããŸãã
- HDDã§ã®ã¢ã»ã³ããªã1ã¹ããªãŒã ã§ã®ã³ã³ãã€ã«ãæé©åãªã;
- SSDã§ã®ã¢ã»ã³ããªã1ã¹ããªãŒã ãžã®ã³ã³ãã€ã«ãæé©åãªã;
- RAMDiskã§ã®ã¢ã»ã³ããªã1ã¹ããªãŒã ãžã®ã³ã³ãã€ã«ãæé©åãªãã
å³1. PVS-Studioã¢ãã©ã€ã¶ãŒã¢ã»ã³ããªã1ã¹ããªãŒã ãæé©åãªãã äžã¯ãããã°ããŒãžã§ã³ã¢ã»ã³ããªãäžã¯ãªãªãŒã¹ã§ããå³ãããããããã«ãã©ã³ãã ã¢ã¯ã»ã¹é床ã倧ããããã1ã¹ã¬ããã§æé©åãããŠããªãRAMDiskã®ãããžã§ã¯ãã¯é«éã«ãªããŸãã
枬å®ã®ç¬¬2段é-ãœãŒã¹ã³ãŒãããã¡ã€ã«ã§å€æŽããŸãïŒããããŒã®äžèŠãªã€ã³ã¯ã«ãŒãã®åé€ãå®çŸ©ãžã®äŸåé¢ä¿ã®æé€ãããªã³ã³ãã€ã«æžã¿ããããŒã®æ¹åïŒé »ç¹ã«å€æŽãããããããŒã®åé€ïŒ-æé©åãåŸã
ã«åŒ·åããŸãïŒ
- 1ã¹ããªãŒã ã§ã®ã³ã³ãã€ã«ãHDDãSSDãRAMãã£ã¹ã¯äžã®ãããžã§ã¯ãïŒ
- ã·ã³ã°ã«ã³ã³ãã€ã«ãŠãããïŒSCUïŒ;
- ããªã³ã³ãã€ã«æžã¿ããããŒïŒPCHïŒ;
- åäžã®ã³ã³ãã€ã«åäœ+ããªã³ã³ãã€ã«æžã¿ããããŒïŒSCU + PCHïŒã
å³2.æé©ååŸã®1ã€ã®ã¹ããªãŒã ãžã®ã³ã³ãã€ã«ã- 4ã€ã®ã¹ããªãŒã ã§ã®ã³ã³ãã€ã«ãHDDãSSDãRAMDiskã§ã®ãããžã§ã¯ãïŒ
- åäžã®ã³ã³ãã€ã«åäœã
- ããªã³ã³ãã€ã«æžã¿ããããŒã
- åäžã®ã³ã³ãã€ã«åäœ+ããªã³ã³ãã€ã«æžã¿ããããŒ
å³3.æé©ååŸã®4ã€ã®ã¹ããªãŒã ã§ã®ã³ã³ãã€ã«ã- 8ã¹ããªãŒã ã§ã®ã³ã³ãã€ã«ãHDDãSSDãRAMDiskã§ã®ãããžã§ã¯ãïŒ
- åäžã®ã³ã³ãã€ã«åäœã
- ããªã³ã³ãã€ã«æžã¿ããããŒã
- åäžã®ã³ã³ãã€ã«åäœ+ããªã³ã³ãã€ã«æžã¿ããããŒ
å³4.æé©ååŸã®8ã¹ã¬ããã§ã®ã³ã³ãã€ã«ãç°¡åãªçµè«ãäžããŸãããã
- SSD / RAMDiskã䜿çšããå©ç¹ã¯ãã¢ãã«ãã©ã³ãã ã¢ã¯ã»ã¹é床ãèµ·åæ¡ä»¶ãã ãŒã³ãã§ã€ãºãªã©ã«ãã£ãŠç°ãªããŸãã ãããã¯HDDã®é«éãªã¢ããã°ã§ããã ç¹ã«ç§ãã¡ã®ã±ãŒã¹ã§ã¯ã倧ããªå©ç¹ã¯ãããŸããã
- ããªã³ã³ãã€ã«æžã¿ããããŒã¯éåžžã«å¹æçãªããŒã«ã§ãã ãã®ã¡ãœããã¯ä»¥åã¢ãã©ã€ã¶ã§äœ¿çšãããŠããŸãããã1ã€ã®ã¹ããªãŒã ã«ã³ã³ãã€ã«ããå Žåã§ã7ã8åã®å éãåŸãããŸããã
- å°æ°ã®åäžã®ç¿»èš³åäœïŒSCUïŒã§ã¯ãããªã³ã³ãã€ã«æžã¿ããããŒãäœæããªãããšããå§ãããŸãã åäžã®å€æãããã¯ã®æ°ãååã«å€§ããïŒ> 10ïŒå Žåã¯ãããªã³ã³ãã€ã«æžã¿ããããŒã䜿çšããŸãã
ãããã«
å€ãã®ããã°ã©ããŒã«ãšã£ãŠãC / C ++èšèªã¯ããã³ã°ã³ã³ãã€ã«ããšããŠé¢é£ä»ããããŠããŸãã ãããŠãããã«ã¯çç±ããããŸãïŒäžåºŠã«éžæããããããŒããã£ã¹ãæ¹åŒãã¡ã¿ããã°ã©ãã³ã°ïŒC ++ã®å ŽåïŒãäœåãã®ã
èšè¿°ãããæé©åæ¹æ³ã®ãããã§ãé床ã«é·ãã³ã³ãã€ã«ã«é¢ãããã®ãããªåèŠãèªåèªèº«ãã奪ãããšãã§ããŸããç¹ã«ãCããã³C ++ã³ãŒããåæããããã®PVS-Studioã¢ãã©ã€ã¶ãŒã³ã¢ã®ã¢ã»ã³ããªæéã¯ãã·ã³ã°ã«ã³ã³ãã€ã«ãŠããããšããããŒããã³ãœãŒã¹ãã¡ã€ã«ã®åŠçãçµ±åããããšã«ããã1å30ç§ãã40ç§ã«ççž®ãããŸãããããã«ãæé©åã®éå§åã«äžŠåã³ã³ãã€ã«ãšããªã³ã³ãã€ã«æžã¿ããããŒã䜿çšãããŠããªãã£ãå Žåãã¢ã»ã³ããªæéã7åã®1ã«ççž®ãããŸãããçµè«ãšããŠããã®åé¡ã¯æšæºåå§å¡äŒã§ããèšæ¶ãããŠããããã®åé¡ã®è§£æ±ºçã¯é 調ã«é²ãã§ãããšä»ãå ããŸããæ°ããC ++ 20æšæºãåŸ
ã£ãŠããŸãã C ++ããã°ã©ãã¯ã¯ããã«ç°¡åã§ãã