äžè¬åå
å§ããåã«ã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ãã¡ã€ã«ïŒ
// TU1.cpp #include <cstdint> int64_t abs(int64_t num) { return num >= 0 ? num : -num; }
TU2.cppãã¡ã€ã«ïŒ
// TU2.cpp #include <cstdint> extern int64_t abs(int64_t num); int main() { return abs(0); }
ããŸããŸãªç¿»èš³åäœã®èª¿æŽãç°¡çŽ åããããã«ãããããŒãã¡ã€ã«ã¡ã«ããºã ãçºæãããæ確ãªã€ã³ã¿ãŒãã§ã€ã¹ã®å®£èšã§æ§æãããŸããã ãã®åŸãå¿ èŠã«å¿ããŠãå翻蚳åäœã«#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 #pragma once class Foo { .... }; // Bar.h #pragma once #include "Foo.h" class Bar { void foo(Foo obj); // <= .... };
ããã§ãæåã®ããããŒãå€æŽãããšãã³ã³ãã€ã©ãŒã¯Foo.hãšBar.hã®äž¡æ¹ã«äŸåãã翻蚳åäœãåã³ã³ãã€ã«ããå¿ èŠããããŸãã
ãã®ãããªæ¥ç¶ã解é€ããã«ã¯ãå€ã«ãã£ãŠobjãªããžã§ã¯ããæž¡ãããšãæåŠãã Bar.hããããŒã®ãã€ã³ã¿ãŒãŸãã¯ãªã³ã¯ã§æž¡ãããšãåªå ããŸãã
// Bar.h #pragma once class Foo; // <= Foo class Bar { void foo(const Foo &obj); // <= .... };
æšæºããããŒã«ã€ããŠã¯ãããã§å¿é ããå¿ èŠã¯ãªããå¿ èŠã«å¿ããŠããããŒãã¡ã€ã«ã«å«ããã ãã§ãã å¯äžã®äŸå€ã¯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 ïŒãæå®ããããšãã§ããŸãã
ã·ã³ã°ã«ã³ã³ãã€ã«ãŠããã
ãã®ã¡ãœããã®æ¬è³ªã¯ãä»ã®ç¿»èš³åäœãå«ãåäžã®ã³ã³ãã€ã«æžã¿ãã¡ã€ã«ïŒç¿»èš³åäœïŒãäœæããããšã§ãïŒ
// SCU.cpp #include "translation_unit1.cpp" .... #include "translation_unitN.cpp"
ãã¹ãŠã®ç¿»èš³åäœãåäžã®ã³ã³ãã€ã«æžã¿ãã¡ã€ã«ã«å«ãŸããŠããå Žåããã®æ¹æ³ã¯ãŠããã£ãã«ããšãåŒã°ããŸãã 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 ++ããã°ã©ãã¯ã¯ããã«ç°¡åã§ãã