ÈÈÆÀÎÄÕÂ
62827,C ¦ÒmʵսָÄÏ£º½âËø½¹µã²Ù×÷È«Á÷³Ì
ÉîÈëC ¦Òmʵս£º´ÓÇéÐδµ½½¹µã²Ù×÷È«ÆÊÎö
ÔÚµ±½ñ¿ìËÙÉú³¤µÄÊÖÒÕÁìÓò£¬ÕÆÎÕ¸ßЧ¡¢Ç¿Ê¢µÄ¿ª·¢¹¤¾ßÓëÆ½Ì¨ÊÇÿһλ´ÓÒµÕߵĽ¹µãËßÇó¡£½ñÌ죬ÎÒÃǽ«ÉîÈë̽ÌÖÒ»¸öÔÚÌØ¶¨¿ª·¢ÕßȦ²ãÖб¸ÊܹØ×¢µÄÖ÷Ì⡪¡ª¡¸C ¦Òm¡¹µÄʵսӦÓᣱ¾ÎÄÖ¼ÔÚÌṩһ·ÝÏ꾡µÄÖ¸ÄÏ£¬Ïòµ¼Äã´ÓÁã×îÏÈ£¬Öð²½½âËøÆä½¹µã²Ù×÷µÄÈ«Á÷³Ì¡£Çë×¢ÖØ£¬±¾Îľ۽¹ÓÚÊÖÒÕ²Ù×÷ÓëÂß¼Ã÷È·£¬ËùÓÐÄÚÈݾù»ùÓÚ¹ûÕæµÄÊÖÒÕÀíÄîÓëÄ£ÄâÇéÐΡ£
µÚÒ»Õ£ºÃ÷È·C ¦Òm¡ª¡ª¿´·¨³ÎÇåÓëÉú̬¶¨Î»
ÔÚ×îÏÈʵս֮ǰ£¬ÎÒÃDZØÐèÏÈÀåÇå¡°C ¦Òm¡±ËùָΪºÎ¡£ÕâÀïµÄ¡°C¡±Í¨³£Ö¸´úÒ»ÖÖÆÕ±éʹÓõġ¢¸ßЧÇÒÌù½üÓ²¼þµÄͨÓñà³ÌÓïÑÔ£¬ÒÔÆäÐÔÄܺͿØÖÆÄÜÁ¦Öø³Æ¡£¶ø¡°¦Òm¡±£¨Sigma m£©Ôò¿É±»Ã÷ȷΪһ¸öÏóÕ÷ÐԵĺó׺£¬´ú±íÒ»ÖÖ¡°¼¯³É»¯Ä£×Ó¡±¡¢¡°¹ÜÀíÄ£¿é¡±»ò¡°Ìض¨Ôª¿ò¼Ü¡±¡£Òò´Ë£¬¡°C ¦Òm¡±ÕûÌå¿ÉÒÔÒþÓ÷ΪÔÚCÓïÑÔÉú̬»òÀàËÆ¸ßÐÔÄÜÇéÐÎÖУ¬Ò»Ì×ϵͳ»¯¡¢Ä£×Ó»¯µÄ¼¯³É¿ª·¢Óë¹ÜÀíʵս¼Æ»®¡£Ëü²¢·Çָij¸ö¼òµ¥Èí¼þ£¬¶øÊÇÒ»Ì׺¸Ç¹¤¾ßÁ´¡¢Éè¼ÆÄ£Ê½¡¢ÐÔÄÜÓÅ»¯¼°ÏîÄ¿¹ÜÀíµÄ×ÛºÏʵ¼ùϵͳ¡£
ÕâÌ×ϵͳµÄÄ¿µÄÊǽâ¾ö´ó¹æÄ£¡¢¸ßÐÔÄÜÅÌËãÏîÄ¿Öеij£¼ûÍ´µã£ºÔõÑù¹ÜÀíÖØ´óµÄ´úÂë½á¹¹£¿ÔõÑùÓÅ»¯ÄÚ´æÓëCPUÖÜÆÚ£¿ÔõÑù¼¯³É¶àÑùµÄ¿âÓëÄ£¿é£¿ÔõÑùʵÏÖ¸ßЧµÄÍŶÓÐ×÷£¿Ã÷È·ÁËÕâÒ»¶¨Î»£¬ÎÒÃǵÄʵսָÄϾÍÓÐÁËÇåÎúµÄ½çÏßºÍÆ«Ïò¡£
µÚ¶þÕ£ºÊµÕ½Æðº½¡ª¡ª¿ª·¢ÇéÐÎÓ빤¾ßÁ´ÉèÖÃ
¹¤ÓûÉÆÆäÊ£¬±ØÏÈÀûÆäÆ÷¡£Ò»¸öÎȹÌÇÒ¸ßЧµÄ¿ª·¢ÇéÐÎÊǺóÐøËùÓвÙ×÷µÄ»ù´¡¡£
1. ½¹µã±àÒëÆ÷Óë¹¹½¨ÏµÍ³Ñ¡Ôñ£º ¹ØÓÚCϵ¿ª·¢£¬GCCºÍClangÊÇÁ½´óÖ÷Á÷±àÒëÆ÷¡£ÔÚ¡°C ¦Òm¡±ÏµÍ³ÖУ¬ÎÒÃǸüÇ¿µ÷¶Ô×îÐÂÓïÑÔ±ê×¼£¨ÈçC17/C18»òÕýÔÚÑݽøÖеÄÌØÕ÷£©µÄÖ§³ÖÒÔ¼°¶Ô¾²Ì¬ÆÊÎöµÄ¼¯³É¡£½¨ÒéͬʱÉèÖÃÁ½Õߣ¬ÒÔ±ã¾ÙÐн»Ö¯ÑéÖ¤¡£¹¹½¨ÏµÍ³·½Ã棬CMakeÒòÆä¿çƽ̨ºÍǿʢµÄÏîÄ¿¹ÜÀíÄÜÁ¦³ÉΪ²»¶þ֮ѡ¡£ÎÒÃǽ«½¨ÉèÒ»¸ö½á¹¹ÇåÎúµÄCMakeLists.txt£¬×÷ΪÕû¸öÏîÄ¿µÄ¡°×ÜÖ¸»Ó¡±¡£
2. ¼¯³É¿ª·¢ÇéÐΣ¨IDE£©Óë±à¼Æ÷£º ËäÈ»ÇáÁ¿¼¶±à¼Æ÷£¨ÈçVim¡¢VSCode£©´îÅäǿʢ²å¼þ£¨clangd, CMake Tools£©ºÜÊÇÎÞа£¬µ«ÏñCLionÕâÀàרΪC/C++Éè¼ÆµÄIDEÄÜÌṩ¸üÉîÌõÀíµÄ´úÂëÃ÷È·¡¢Öع¹ºÍµ÷ÊÔÖ§³Ö¡£ÔÚ¡°C ¦Òm¡±Á÷³ÌÖУ¬ÎÒÃÇÍÆ¼öÒÔCLion»òVSCodeΪ½¹µã£¬ÉèÖÃͳһµÄ´úÂëÃûÌû¯¹¤¾ß£¨Èçclang-format£©ºÍ¾²Ì¬ÆÊÎö¹¤¾ß£¨Èçclang-tidy£©£¬È·±£´úÂëÆø¸ÅÓëÖÊÁ¿µÄÒ»ÖÂÐÔ¡£
3. ÒÀÀµ¹ÜÀíÓë°ü¹ÜÀí£º ÏÖ´úC++ÏîÄ¿Àë²»¿ªµÚÈý·½¿â¡£Conan»òvcpkgÊÇÄ¿½ñÖ÷Á÷µÄ°ü¹ÜÀíÆ÷¡£ÎÒÃǽ«ÑÝʾÔõÑù½«Conan¼¯³Éµ½CMakeÖУ¬ÊµÏÖÒÀÀµµÄ×Ô¶¯ÏÂÔØ¡¢±àÒëºÍÁ´½Ó£¬ÕâÊÇʵÏÖ¡°Ä£¿é»¯¡±¹ÜÀíµÄÒªº¦Ò»²½¡£
4. °æ±¾¿ØÖÆÓëÐ×÷»ùʯ£º GitÊDZêÅä¡£³ýÁË»ù±¾µÄ´úÂëÍйܣ¬ÎÒÃǽ«Öصã·ÅÔÚ·ÖÖ§Õ½ÂÔ£¨ÈçGit Flow£©¡¢Ìá½»ÐÅÏ¢¹æ·¶ÒÔ¼°.gitignoreÎļþµÄϸÄåÉèÖÃÉÏ£¬È·±£ÏîÄ¿ÀúÊ·ÇåÎú¿É×·ËÝ¡£
µÚÈýÕ£º½¹µã¼Ü¹¹¡ª¡ªÏîÄ¿½á¹¹ÓëÄ£¿é»¯Éè¼Æ
ÇéÐÎÍ£µ±ºó£¬ÎÒÃÇÐèÒª¹¹½¨Ò»¸ö¿ÉÒ»Á¬Î¬»¤µÄÏîÄ¿¹Ç¼Ü¡£ÕâÊÇ¡°C ¦Òm¡±ÖС°Ä£×Ó»¯¡±µÄÖ±¹ÛÌåÏÖ¡£
1. ·Ö²ãÓë·ÖÄ£¿éĿ¼½á¹¹£º ÞðÆúËùÓÐÎļþ¶Ñ·ÅÔÚÒ»¸öĿ¼µÄªϰ¡£Ò»¸öµä·¶µÄ¡°C ¦Òm¡±ÏîĿĿ¼¿ÉÄÜÈçÏÂËùʾ£º
```
my_csigma_project/
©À©¤©¤ CMakeLists.txt # ¸ùCMakeÉèÖÃÎļþ
©À©¤©¤ conanfile.txt # ConanÒÀÀµ½ç˵
©À©¤©¤ .clang-format # ´úÂëÆø¸Å½ç˵
©À©¤©¤ .gitignore
©À©¤©¤ src/ # Ô´´úÂëĿ¼
©¦ ©À©¤©¤ core/ # ½¹µãËã·¨ÓëÊý¾Ý½á¹¹Ä£¿é
©¦ ©¦ ©À©¤©¤ CMakeLists.txt
©¦ ©¦ ©¸©¤©¤ ...
©¦ ©À©¤©¤ network/ # ÍøÂçͨѶģ¿é
©¦ ©À©¤©¤ utils/ # ͨÓù¤¾ßÄ£¿é
©¦ ©¸©¤©¤ app/ # Ö÷Ó¦ÓóÌÐòÈë¿Ú
©À©¤©¤ include/ # ¹«¹²Í·ÎļþĿ¼£¨ÈôÊÇÐèÒª£©
©À©¤©¤ tests/ # µ¥Î»²âÊÔÓ뼯³É²âÊÔ
©À©¤©¤ benchmarks/ # ÐÔÄÜ»ù×¼²âÊÔ
©À©¤©¤ docs/ # ÏîÄ¿Îĵµ
©¸©¤©¤ scripts/ # ¹¹½¨¡¢°²Åŵȸ¨Öú¾ç±¾
```
ÿ¸ö×ÓĿ¼¶¼ÊÇÒ»¸ö×ÔÁ¦µÄCMakeÄ£¿é£¬Í¨¹ý¸ùCMakeLists.txtµÄ`add_subdirectory`ÏÂÁî¾ÙÐÐ×é×°¡£ÕâÖÖ½á¹¹Ç¿ÖÆÊµÏÖÁ˹Ø×¢µãÊèÉ¢£¬ÊÇ´óÐÍÏîÄ¿¹ÜÀíµÄ»ùʯ¡£
2. Í·Îļþ¹ÜÀíÓë½Ó¿ÚÉè¼Æ£º ÔÚCÓïÑÔÖУ¬Í·ÎļþÊÇÄ£¿éµÄ½Ó¿ÚÌõÔ¼¡£ÎÒÃÇÑÏ¿á×ñÊØ¡°×Ô°üÀ¨¡±£¨¼´²»ÒÀÀµÆäËûÍ·Îļþ±»Ìض¨Ë³Ðò°üÀ¨£©ºÍ¡°×îСÒÀÀµ¡±ÔÔò¡£Ê¹ÓÃ`#pragma once`»ò±ê×¼µÄÍ·ÎļþÊØÎÀ£¬²¢×ÐϸÉè¼ÆÇ°ÖÃÉùÃ÷ÒÔïÔ̱àÒëÒÀÀµ£¬¼ÓËÙ±àÒëÀú³Ì¡£
µÚËÄÕ£º±àÂëʵս¡ª¡ª½¹µãģʽÓëÐÔÄÜÓÅ»¯
½øÈëÏêϸµÄ±àÂë½×¶Î£¬¡°C ¦Òm¡±Ç¿µ÷¼¸ÖÖ½¹µãµÄ¿ª·¢Ä£Ê½¡£
1. ¹ýʧ´¦Öóͷ£Ä£×Ó£º ÞðÆú¼òÆÓµÄ·µ»Ø¹ýʧÂë»òËæ´¦Ê¹ÓÃ`assert`¡£ÎÒÃÇÒýÈë¸üϵͳ»¯µÄ·½·¨¡£¹ØÓÚ¿â´úÂ룬¿ÉÒÔ½ç˵ͳһµÄ¹ýʧÀàÐÍö¾ÙºÍ¹ýʧ»Øµ÷º¯ÊýÖ¸Õ룻¹ØÓÚÓ¦ÓóÌÐò£¬¿ÉÒÔ˼Á¿Ê¹ÓÃÀàËÆ`
2. ÄÚ´æ¹ÜÀíÕ½ÂÔ£º ÊÖ¶¯¹ÜÀíÄÚ´æÊÇCµÄÇ¿ÏîÒ²ÊÇÍ´µã¡£¡°C ¦Òm¡±Êµ¼ùÍÆÐí¡°×ÊÔ´»ñÈ¡¼´³õʼ»¯¡±£¨RAII£©Í·ÄÔ£¬×ÝÈ»ÊÇÔÚ´¿CÖУ¬Ò²¿ÉÒÔͨ¹ý½á¹¹/Îö¹¹º¯Êý¶Ô£¨Èç`init_type`/`destroy_type`£©À´Ä£Äâ¡£ËùÓж¯Ì¬·ÖÅɵÄ×ÊÔ´£¬±ØÐèÓÐÇÒÖ»ÓÐÒ»¸öÃ÷È·µÄ¹éÊôºÍÊͷŵ㡣ͬʱ£¬³ä·ÖʹÓÃÖÇÄÜÖ¸Õ루ÔÚC++ÖУ©»ò×Ô½ç˵µÄÄÚ´æ³Ø¡¢¹¤¾ß³ØÀ´¹ÜÀíÌØ¶¨³¡¾°ÏÂµÄ¸ßÆµ·ÖÅÉ/ÊÍ·Å£¬ÕâÊÇÐÔÄÜÓÅ»¯µÄÒªº¦¡£
3. Êý¾Ý½á¹¹ÓëË㷨ѡÔñ£º ƾ֤Êý¾Ý¹æÄ£ºÍ»á¼ûģʽ£¬È«ÐÄÑ¡Ôñ×îºÏÊʵĻù´¡Êý¾Ý½á¹¹¡£ÀýÈ磬ƵÈÔ²åÈëɾ³ýÇÒÎÞÐèËæÊ±»ú¼û£¬Ë¼Á¿Á´±í£»ÐèÒª¿ìËÙ²éÕÒ£¬Ê¹ÓùþÏ£±í»òƽºâ¶þ²æÊ÷¡£ÔÚ¡°C ¦Òm¡±ÖУ¬ÎÒÃDz»µ«Ê¹Óñê×¼¿âʵÏÖ£¬¸üÃãÀøÔÚÐÔÄÜÆ¿¾±´¦£¬ÎªÌض¨³¡¾°¶¨ÖƸ߶ÈÓÅ»¯µÄÊý¾Ý½á¹¹¡£
4. ²¢·¢Óë¶àỊ̈߳º ÏÖ´ú³ÌÐòÀë²»¿ª²¢·¢¡£ÎÒÃǽ«ÏµÍ³ÏÈÈÝÔõÑùʹÓÃỊ̈߳¨ÈçPOSIX threads»òC11 threads£©¡¢»¥³âËø¡¢Ìõ¼þ±äÁ¿ÒÔ¼°¸ü¸ß¼¶µÄÎÞËø±à³Ì·¶Ê½¡£ÖصãÔÚÓÚÃ÷È·Êý¾Ý¾ºÕù¡¢ËÀËøµÄ×èÖ¹£¬ÒÔ¼°ÔõÑùÉè¼ÆÏß³ÌÇå¾²µÄÊý¾Ý½Ó¿Ú¡£ÐÔÄÜÆÊÎö¹¤¾ß£¨Èçperf, Valgrind£©µÄʹÓý«¹á´®Ê¼ÖÕ£¬×ÊÖú¶¨Î»ÈÈÃÅºÍÆ¿¾±¡£
µÚÎåÕ£ºÖÊÁ¿°ü¹Ü¡ª¡ª²âÊÔ¡¢µ÷ÊÔÓëÒ»Á¬¼¯³É
ûÓÐÖÊÁ¿°ü¹ÜµÄ´úÂëÓÌÈçûÓеػùµÄÐÞ½¨¡£
1. µ¥Î»²âÊÔ¿ò¼Ü¼¯³É£º ʹÓÃGoogle Test»òCatch2µÈ¿ò¼ÜΪÿ¸ö½¹µãÄ£¿é±àдµ¥Î»²âÊÔ¡£²âÊÔ´úÂëÓëÉú²ú´úÂëÒ»ÂÉÖ÷Òª¡£ÎÒÃǽ«²âÊÔ¼¯³Éµ½CMakeµÄCTestÖУ¬Ê¹µÃͨ¹ýÒ»ÌõÏÂÁÈç`make test`£©¼´¿ÉÔËÐÐËùÓвâÊÔ¡£
2. ¸ßЧµÄµ÷ÊÔ¼¼ÇÉ£º ÓâÔ½¼òÆÓµÄ`printf`¡£ÊìÁ·Ê¹ÓÃGDB»òLLDB¾ÙÐжϵãµ÷ÊÔ¡¢ÊÓ²ìµãÉèÖá¢ÄÚ´æÉó²é¡¢·´Ïòµ÷ÊԵȡ£¹ØÓÚÖØ´óµÄÄÚ´æÎÊÌ⣬AddressSanitizer¡¢UndefinedBehaviorSanitizerµÈ±àÒëʱ²å×®¹¤¾ßÊÇ·¢Ã÷Òþ²Ø¹ýʧµÄÀûÆ÷¡£
3. Ò»Á¬¼¯³É/Ò»Á¬°²ÅÅ£¨CI/CD£©Á÷Ë®Ïߣº ÕâÊÇ¡°È«Á÷³Ì¡±×Ô¶¯»¯µÄÖ÷ÒªÒ»»·¡£ÎÒÃǽ«ÉèÖÃÒ»¸ö»ùÓÚGitHub Actions»òGitLab CIµÄÁ÷Ë®Ïߣ¬ÊµÏÖ´úÂëÍÆËͺó×Ô¶¯´¥·¢£ºÀÈ¡ÒÀÀµ¡¢±àÒëËùÓÐÆ½Ì¨ºÍÉèÖã¨Debug/Release£©¡¢ÔËÐÐÈ«ÌײâÊÔ¡¢Ö´Ðо²Ì¬´úÂëÆÊÎö¡¢ÌìÉú´úÂëÁýÕÖÂʱ¨¸æ£¬ÉõÖÁ×Ô¶¯¹¹½¨×°Öðü¡£ÕâÈ·±£ÁË´úÂë¿âµÄÖ÷¸ÉʼÖÕ´¦ÓÚ¿µ½¡×´Ì¬¡£
µÚÁùÕ£º½ø½×֮·¡ª¡ªÐÔÄÜÆÊÎö¡¢µ÷ÓÅÓë¿çƽ̨ÊÊÅä
µ±»ù´¡¹¦Ð§Îȹ̺ó£¬×·Çó¼«ÖÂÐÔÄÜºÍÆÕ±éµÄ˳ӦÐÔ³ÉΪĿµÄ¡£
1. ϵͳ»¯ÐÔÄÜÆÊÎö£º ʹÓÃ`perf`£¨Linux£©»ò`Instruments`£¨macOS£©µÈ¹¤¾ß¾ÙÐÐCPUÐÔÄÜÆÊÎö£¬ÕÒµ½ÕæÕýµÄ¡°ÈÈÃÅ¡±º¯Êý¡£Ê¹ÓÃValgrindµÄCachegrind¹¤¾ßÆÊÎö»º´æÖÀÖÐÂÊ¡£Æ¾Ö¤ÆÊÎöЧ¹û£¬¾ÙÐÐÕë¶ÔÐÔÓÅ»¯£º¿ÉÄÜÊÇËã·¨ÖØÆ¯ºóÓÅ»¯£¬¿ÉÄÜÊǸıäÊý¾Ý½á¹¹ÒÔÌá¸ß»º´æÓѺÃÐÔ£¨Êý¾Ýµ¼ÏòÉè¼Æ£©£¬Ò²¿ÉÄÜÊÇÒýÈëSIMDÖ¸Áî¾ÙÐÐÏòÁ¿»¯ÅÌËã¡£
2. ¿çƽ̨±àÒëÓëÊÊÅ䣺 ¡°C ¦Òm¡±ÏîÄ¿ÍùÍùÐèÒªÔËÐÐÔÚ¶àÖÖ²Ù×÷ϵͳ£¨Linux, Windows, macOS£©ÉõÖÁǶÈëʽƽ̨ÉÏ¡£CMakeÔÚ´ËÊ©Õ¹ÖØ×ÅÊöÓá£ÎÒÃÇÐèÒªÁýͳƽ̨Ïà¹ØµÄ´úÂ루ÈçÎļþ·¾¶¡¢Ï߳̽ӿڡ¢ÍøÂçŲÓã©£¬½«Æä·â×°ÔÚ×ÔÁ¦µÄÄ£¿éÖУ¬²¢Í¨¹ýÌõ¼þ±àÒ루`#ifdef`£©»òÔËÐÐʱ¼ì²âÀ´Ìṩͳһ½Ó¿Ú¡£ConanµÈ°ü¹ÜÀíÆ÷Ò²ÄÜ×ÊÖú¹ÜÀí²î±ðƽ̨ÉϵĶþ½øÖÆÒÀÀµ¡£
3. ÎĵµÓë֪ʶ³Áµí£º ÓÅÒìµÄÏîÄ¿Àë²»¿ªÓÅÒìµÄÎĵµ¡£ÎÒÃDz»µ«Ê¹ÓÃDoxygen»òSphinx´Ó´úÂë×¢ÊÍÖÐÌìÉúAPIÎĵµ£¬¸üÃãÀø±àд×ÔÁ¦µÄ¼Ü¹¹Éè¼ÆÎĵµ¡¢Ä£¿éÉè¼ÆËµÃ÷ºÍÒªº¦µÄËã·¨Ú¹ÊÍ¡£ÎĵµÓë´úÂëͬ²½¸üУ¬ÊÇÍŶÓÐ×÷ºÍÏîÄ¿´«³ÐµÄ°ü¹Ü¡£
ͨ¹ýÒÔÉÏÁù¸öÕ½ڵÄÖð²½ÉîÈ룬ÎÒÃÇÍêÕûµØ×ß¹ýÁË¡°C ¦Òm¡±ÊµÕ½µÄ½¹µãÁ÷³Ì¡£´ÓÇéÐδµ½¼Ü¹¹Éè¼Æ£¬´Ó±àÂëʵ¼ùµ½ÖÊÁ¿°ü¹Ü£¬ÔÙµ½×îºóµÄÐÔÄܵ÷ÓÅÓë¿çƽ̨°²ÅÅ£¬Ã¿Ò»¸ö»·½Ú¶¼»·»·Ïà¿Û£¬ÅäºÏ×é³ÉÁËÒ»Ì×¼áʵµÄ¸ßÐÔÄÜCϵÏîÄ¿¿ª·¢Óë¹ÜÀíϵͳ¡£¼Çס£¬ÕÆÎÕ¹¤¾ßºÍÁ÷³ÌÊÇ»ù´¡£¬µ«¸üÖ÷ÒªµÄÊÇ×÷Óý³öϵͳ»¯Ë¼Ë÷Ï¢Õù¾öÖØ´ó¹¤³ÌÎÊÌâµÄÄÜÁ¦£¬Õâ²ÅÊÇ¡°C ¦Òm¡±ÊµÕ½Ö¸ÄÏÏ£Íûת´ïµÄ¾«Ëè¡£
±¾ÎÄÎÊÌ⣺¡¶62827,C ¦ÒmʵսָÄÏ£º½âËø½¹µã²Ù×÷È«Á÷³Ì¡·










½ÒÏþ̸ÂÛ