การเขียนโปรแกรม C++ สมัยใหม่

C++03 / C++11 / C++14 / C++17 / C++20 / C++23 / C++26
หลักสูตร แบบเปิด นี้มุ่งไปที่ผู้ที่คุ้นเคยกับ C และการเขียนโปรแกรมเชิงวัตถุอยู่แล้ว ไปสู่ระดับความเชี่ยวชาญในการเขียนโปรแกรม C++ หลักสูตรนี้ครอบคลุมพื้นฐานของการเขียนโปรแกรม C++ และก้าวไปสู่ความหมายและแนวคิด C++ ขั้นสูง
คุณสมบัติที่สำคัญ :
- ฟรีและอัปเดตบ่อยครั้ง
- 26 การบรรยาย, 1,800+ สไลด์
- รวมแนวคิดและคุณลักษณะ มาตรฐานภาษาล่าสุด
- การสอนเชิงปฏิบัติ : คำอธิบายแบบไม่มีโครงสร้างสั้นๆ ที่เกี่ยวข้องกับโค้ด
- ตัวอย่างโค้ดขั้นต่ำ สำหรับการแสดงเฉพาะคุณลักษณะหรือปัญหาโดยไม่ต้องพูดนอกเรื่อง
- ด้านภาษาเสริม : เครื่องมือ รูปแบบการเขียนโค้ด การจัดระเบียบโครงการ และการเพิ่มประสิทธิภาพโค้ด
- ตามประสบการณ์ : แง่มุม ตัวอย่าง และปัญหามากมายมาจากกรณีจริงที่ต้องเผชิญระหว่างทำงานในตำแหน่งวิศวกรซอฟต์แวร์
หากคุณชอบหลักสูตรนี้หรือพบว่ามีประโยชน์ โปรดติด ดาว
บท
| - | ชื่อ | โฟกัสหลัก |
|---|
| 1 | บทนำ (html) | ประวัติความเป็นมาของ C/C++ ขอบเขตการใช้งาน การแนะนำหลักสูตร |
| 2 | การเตรียมการ (html) | หนังสือ เรียบเรียง สวัสดีชาวโลก |
| 3 | แนวคิดพื้นฐาน 1 (html) | ประเภทระบบ ประเภทพื้นฐาน และตัวดำเนินการ |
| 4 | แนวคิดพื้นฐาน II (html) | ประเภทจุดอินทิกรัลและจุดลอยตัวและเลขคณิต |
| 5 | แนวคิดพื้นฐาน III (html) | เอนทิตี ตัวแจงนับ โครงสร้าง คำสั่งโฟลว์ควบคุม |
| 6 | แนวคิดพื้นฐาน IV (html) | ฮีป, สแต็ก, พอยน์เตอร์, การอ้างอิง, คุณสมบัติ Const, ตัวดำเนินการแปลง |
| 7 | แนวคิดพื้นฐาน V (html) | ฟังก์ชัน, นิพจน์แลมบ์ดา, คำสั่งการประมวลผลล่วงหน้า |
| 8 | การเขียนโปรแกรมเชิงวัตถุ 1 (html) | ลำดับชั้นของคลาส, Constructor, Destructor, คีย์เวิร์ดของคลาส |
| 9 | การเขียนโปรแกรมเชิงวัตถุ II (html) | Polymorphism ตัวดำเนินการโอเวอร์โหลด |
| 10 | เทมเพลตและการเขียนโปรแกรม Meta I (html) | เทมเพลตฟังก์ชัน ลักษณะเฉพาะ ยูทิลิตี้เวลาคอมไพล์ |
| 11 | เทมเพลตและการเขียนโปรแกรม Meta II (html) | เทมเพลตชั้นเรียน SFINAE |
| 12 | หน่วยการแปล I (html) | การเชื่อมโยงและกฎคำจำกัดความเดียว |
| 13 | หน่วยการแปล II (html) | การจัดการกับหน่วยการแปลและไฟล์หลายไฟล์ #include , โมดูล |
| 14 | อนุสัญญารหัส I (html) | การจัดระเบียบโครงการ บทนำแบบแผนโค้ด แบบแผนเอนทิตี |
| 15 | อนุสัญญารหัส II (html) | เทมเพลต เนมสเปซ c++ สมัยใหม่ ความสามารถในการบำรุงรักษา การตั้งชื่อ และรูปแบบการจัดรูปแบบ |
| 16 | การดีบักและการทดสอบ (html) | การดำเนินการ/การดีบักหน่วยความจำ, การฆ่าเชื้อ, เทคนิคการฮาร์ดิง, การทดสอบหน่วย, การพัฒนาที่ขับเคลื่อนด้วยการทดสอบ |
| 17 | ระบบนิเวศ (html) | Cmake การจัดทำเอกสาร และเครื่องมืออื่นๆ |
| 18 | ยูทิลิตี้ (html) | ไลบรารี std หลัก |
| 19 | คอนเทนเนอร์ ตัววนซ้ำ และอัลกอริทึม (html) | คอนเทนเนอร์ ตัววนซ้ำ อัลกอริธึม ช่วง |
| 20 | หัวข้อขั้นสูง I (html) | ย้ายซีแมนทิกส์ การอ้างอิงสากล การหักประเภท |
| 21 | หัวข้อขั้นสูง II (html) | การจัดการข้อผิดพลาด สำนวน C++ ตัวชี้อัจฉริยะ |
| 22 | การเพิ่มประสิทธิภาพการทำงาน I (html) | กฎ Ahmdal, ขอบเขตของประสิทธิภาพ, แนวคิดทางสถาปัตยกรรม (ILP, SIMD ฯลฯ) ลำดับชั้นของหน่วยความจำ |
| 23 | การเพิ่มประสิทธิภาพประสิทธิภาพ II (html) | การเพิ่มประสิทธิภาพทางคณิตศาสตร์ การเพิ่มประสิทธิภาพหน่วยความจำ ฯลฯ |
| 24 | การเพิ่มประสิทธิภาพการทำงาน III (html) | การเพิ่มประสิทธิภาพคอมไพเลอร์ การทำโปรไฟล์ เครื่องมือการเปรียบเทียบ |
| 25 | การออกแบบซอฟต์แวร์ 1 (html) | แนวคิดพื้นฐาน หลักการ กรณีการใช้งาน |
| 26 | การออกแบบซอฟต์แวร์ II (html) | รูปแบบการออกแบบและสำนวน |
หนังสือ ALL-IN-ONE : modern-cpp.pdf (อาจมีคอมมิตอยู่เบื้องหลัง), html
หัวข้อในรายละเอียด
1. บทนำ
- ประวัติเล็กๆ น้อยๆ ของภาษาการเขียนโปรแกรม C/C++
- ขอบเขตการใช้งานและความนิยม
- ปรัชญา C++
- จุดอ่อนของ C ++ : ทางเลือก C ++ เหตุใดการเปลี่ยนเป็นภาษาใหม่จึงเป็นเรื่องยาก
- หลักสูตร
2. การเตรียมการ
- หนังสือและข้อมูลอ้างอิง
- สไลด์ตำนาน
- ฉันควรใช้ตัวแก้ไข/ IDE/คอมไพเลอร์ตัวใด
- วิธีการรวบรวม?
- สวัสดีชาวโลก : สตรีม I/O
3. แนวคิดพื้นฐาน I - ระบบประเภท ประเภทพื้นฐาน และตัวดำเนินการ
- ระบบประเภท C++ : ประเภทประเภท คุณสมบัติประเภท
- ภาพรวมประเภทพื้นฐานของ C++ : ประเภทเลขคณิต, คำต่อท้ายและคำนำหน้า, ประเภทเลขคณิตที่ไม่ได้มาตรฐาน, ประเภท
void , nullptr - กฎการแปลง
- คำหลัก
auto - ตัวดำเนินการ C++ : ตัวดำเนินการที่มีความสำคัญกว่า, คำนำหน้า/ความหมายการเพิ่ม/ลดค่าของคำนำหน้า, ตัวดำเนินการการมอบหมาย, สารประกอบ และเครื่องหมายจุลภาค, ตัวดำเนินการยานอวกาศ
<=> , ตัวดำเนินการเปรียบเทียบที่ปลอดภัย
4. แนวคิดพื้นฐาน II - ประเภทอินทิกรัลและจุดลอยตัว
- ประเภทข้อมูลที่เป็นอินทิกรัล : จำนวนเต็มความกว้างคงที่,
size_t , ptrdiff_t , uintptr_t , อรรถศาสตร์การดำเนินการทางคณิตศาสตร์, การส่งเสริม, การตัดทอน, พฤติกรรมที่ไม่ได้กำหนด, เลขคณิตความอิ่มตัว - ประเภทจุดลอยตัวและเลขคณิต : มาตรฐานจุดลอยตัวของ IEEE และการแทนค่าอื่นๆ, ค่าปกติ/ดีนอร์มอล, อนันต์, ไม่ใช่ตัวเลข (
NaN ), เอปไซลอนของเครื่องจักร, หน่วยที่ตำแหน่งสุดท้าย (ULP), เอกสารสรุป, ขีดจำกัดและฟังก์ชันที่มีประโยชน์, เลขคณิต คุณสมบัติ พฤติกรรมของค่าพิเศษ พฤติกรรมที่ไม่ได้กำหนด ตรวจจับข้อผิดพลาดจุดลอยตัว - ปัญหาจุดลอยตัว : การยกเลิกภัยพิบัติ การเปรียบเทียบจุดลอยตัว
5. แนวคิดพื้นฐาน III - เอนทิตีและโฟลว์การควบคุม
- เอนทิตี
- คำประกาศและคำจำกัดความ
- ตัวแจงนับ
-
struct , Bitfield, union - โฟลว์การควบคุม : คำสั่ง
if , for และ while loops, Range-base for loop, switch , goto , หลีกเลี่ยงการเตือนตัวแปรที่ไม่ได้ใช้ - เนม สเปซ : เนมสเปซส่วนกลางที่ชัดเจน, นามแฝงของเนมสเปซ,
using -declaration, using namespace -directive, เนมสเปซ inline - คุณสมบัติ :
[[nodiscard]] , [[maybe_unused]] , [[deprecated]] , [[noreturn]]
6. แนวคิดพื้นฐาน IV - แนวคิดหน่วยความจำ
- พอยน์เตอร์ : การดำเนินการของพอยน์เตอร์, ที่อยู่ของตัวดำเนินการ
& , การเข้าถึงสมาชิก struct , พอยน์เตอร์ void , การแปลงพอยน์เตอร์, เลขคณิตของพอยน์เตอร์, พอยน์เตอร์แบบไวด์และห้อยต่องแต่ง - ฮีปและสแต็ก : หน่วยความจำสแต็ก,
new , delete , การจัดสรรตำแหน่งแบบไม่จัดสรร, การจัดสรรแบบไม่ทิ้ง, หน่วยความจำรั่ว - การเริ่มต้น : การเริ่มต้นตัวแปร, การเริ่มต้นแบบสม่ำเสมอ, การเริ่มต้นอาร์เรย์, การเริ่มต้นโครงสร้าง, การเชื่อมโยงโครงสร้าง, การเริ่มต้นหน่วยความจำแบบไดนามิก
- อ้างอิง
-
Const และนิพจน์คงที่ : Contants และตัวอักษร, const , constexpr , consteval , constinit , if constexpr , std::is constant evaluated() if consteval - คำหลัก
volatile - การแปลงประเภทที่ชัดเจน :
static_cast , const_cast , reinterpret_cast , พิมพ์ punning, std::bit_cast , การแปลงการเริ่มต้นที่สม่ำเสมอ, gls::narrow_cast -
sizeof ตัวดำเนินการ : ภาพรวม, [[no_unique_address]]
7. แนวคิดพื้นฐาน V - ฟังก์ชั่นและการประมวลผลล่วงหน้า
- ฟังก์ชัน : ส่งผ่านค่า, ส่งผ่านตัวชี้, ผ่านการอ้างอิง, ลายเซ็นฟังก์ชันและการโอเวอร์โหลด, การโอเวอร์โหลดและ
=delete , พารามิเตอร์เริ่มต้น - ตัวชี้ฟังก์ชันและวัตถุฟังก์ชัน
- นิพจน์แลมบ์ดา : รายการจับภาพ, นิพจน์แลมบ์ดาและความสัมพันธ์ของฟังก์ชัน, บันทึกพารามิเตอร์, ความสามารถในการประกอบ, การเรียกซ้ำ,
constexpr/consteval , template , mutable , [[nodiscard]] , รายการจับภาพและคลาส - การประมวลผล ล่วงหน้า : ตัวประมวลผลล่วงหน้า, ข้อผิดพลาดทั่วไป, มาโครตำแหน่งต้นทาง, มาโครการคอมไพล์แบบมีเงื่อนไข, ตัวดำเนินการสตริง (
# ), #error และ #warning , #pragma , ตัวดำเนินการวางโทเค็น ## , แมโคร Variadic
8. การเขียนโปรแกรมเชิงวัตถุ I - แนวคิดของคลาส
- คลาส C++ : สำนวน RAII
- ลำดับชั้นของชั้นเรียน
- ตัวระบุการเข้าถึง : ตัวระบุการเข้าถึงแบบสืบทอด เมื่อใช้
public/protected/private สำหรับสมาชิกข้อมูลเมื่อใด - ตัวสร้างคลาส : ตัวสร้างเริ่มต้น, การกำหนดค่าเริ่มต้นของคลาส, การกำหนดค่าเริ่มต้นแบบสม่ำเสมอสำหรับอ็อบเจ็กต์, ตัวสร้างผู้รับมอบอำนาจ, คีย์เวิร์ด
explicit , [[nodiscard]] และคลาส - ตัวสร้างการคัดลอก
- ตัวทำลายคลาส
- Constructor, Destructor และ Operators ที่ผิดนัด (
= default ) - คีย์เวิร์ดของคลาส :
this , static , const , mutable , using , friend , delete
9. การเขียนโปรแกรมเชิงวัตถุ II - ความหลากหลายและการโอเวอร์โหลดของตัวดำเนินการ
- พหุมอร์ฟิซึม : กลไก C++ สำหรับพหุมอร์ฟิซึม วิธี
virtual ตาราง override คำสำคัญแทนที่ คำสำคัญ final ข้อผิดพลาดทั่วไป วิธีเสมือนบริสุทธิ์ คลาสนามธรรมและอินเทอร์เฟซ - การหล่อแบบสืบทอดและการระบุประเภทรันไทม์
- ตัวดำเนินการโอเวอร์โหลด : ภาพรวม ตัวดำเนินการเปรียบเทียบ
< , ตัวดำเนินการยานอวกาศ <=> , ตัวดำเนินการตัวห้อย [] , ตัวดำเนินการตัวห้อยหลายมิติ [] , ตัวดำเนินการเรียกฟังก์ชัน () , ตัวดำเนินการคงที่ [] และตัวดำเนินการ () , ตัวดำเนินการการแปลง T() , การบรรทุกเกินประเภทการส่งคืน ความละเอียด, ตัวดำเนินการเพิ่มและลด ++ / -- , ตัวดำเนินการกำหนด = , ตัวดำเนินการสตรีม << , หมายเหตุตัวดำเนินการ - เค้าโครงวัตถุ C++ : รวม, คลาส Trivial, คลาสเค้าโครงมาตรฐาน, ข้อมูลเก่าธรรมดา (POD), ลำดับชั้น
10. เทมเพลตและการเขียนโปรแกรมเมตา I - เทมเพลตฟังก์ชันและยูทิลิตี้เวลาคอมไพล์
- เทมเพลตฟังก์ชัน : ภาพรวม, การสร้างอินสแตนซ์เทมเพลต, พารามิเตอร์เทมเพลต, พารามิเตอร์เทมเพลต - ค่าเริ่มต้น, การโอเวอร์โหลด, ความเชี่ยวชาญพิเศษ
- ตัวแปรเทมเพลต
- ประเภทพารามิเตอร์เทมเพลต : หมายเหตุประเภททั่วไป, ตัวยึดตำแหน่ง
auto , ประเภทพารามิเตอร์เทมเพลตคลาส, ประเภทอาร์เรย์และตัวชี้, ประเภทฟังก์ชัน - ยูทิลิตี้คอมไพล์เวลา :
static_assert using คีย์เวิร์ด คีย์เวิร์ด decltype - ลักษณะประเภท : ภาพรวม, ไลบรารีลักษณะประเภท, การจัดการประเภท
11. เทมเพลตและการเขียนโปรแกรม Meta II - เทมเพลตคลาสและ SFINAE
- เทมเพลตของชั้นเรียน : ความเชี่ยวชาญเฉพาะทางของชั้นเรียน ตัวสร้างเทมเพลตของชั้นเรียน
- ตัวสร้างเทมเพลตการหักอัตโนมัติ (CTAD)
- เทมเพลตชั้นเรียน - แนวคิดขั้นสูง : คลาส + ฟังก์ชัน - ความเชี่ยวชาญพิเศษ ชื่อที่ขึ้นต่อกัน -
typename และคีย์เวิร์ด template ลำดับชั้นเทมเพลตคลาสและ using คีย์เวิร์ด friend อาร์กิวเมนต์เทมเพลตเทมเพลต - การเขียนโปรแกรมเมตาเทมเพลต
- SFINAE: ความล้มเหลวในการทดแทนไม่ใช่ข้อผิดพลาด : ฟังก์ชัน SFINAE, คลาส SFINAE
- เทมเพลต Variadic : นิพจน์แบบพับได้, เทมเพลตคลาส Variadic
- แนวคิด C++20 : ภาพรวม, คีย์เวิร์ดของ
concept , requires ส่วนคำสั่ง, requires นิพจน์, requires นิพจน์ + ส่วนคำสั่ง, requires ส่วนคำสั่ง + นิพจน์, requires และ constexpr , requires แบบซ้อน - การดีบักเทมเพลต
12. หน่วยการแปล I - การเชื่อมโยงและกฎคำจำกัดความเดียว
- แนวคิดพื้นฐาน : หน่วยการแปล ขอบเขตระดับท้องถิ่นและระดับโลก การเชื่อมโยง
- คลาสการจัดเก็บข้อมูลและระยะเวลา : ระยะเวลาการจัดเก็บข้อมูล, คลาสการจัดเก็บข้อมูล, คีย์เวิร์ด
static , เนมสเปซที่ไม่ระบุชื่อ, คีย์เวิร์ด extern - การเชื่อมโยงของ
const และ constexpr : ความล้มเหลวของคำสั่งการเริ่มต้นแบบคงที่ - สรุปการเชื่อมโยง
- การจัดการกับหน่วยการแปลหลายหน่วย : คลาสในหน่วยการแปลหลายหน่วย
- กฎคำจำกัดความเดียว (ODR) : ปัญหาตัวแปรส่วนกลาง, ODR - จุดที่ 3, ฟังก์ชัน/ตัวแปร
inline , constexpr และ inline - ODR - เทมเพลตฟังก์ชัน : เคส, คีย์เวิร์ด
extern - ODR - เทมเพลตชั้นเรียน : กรณีและปัญหา คำหลัก
extern - ODR พฤติกรรมและข้อมูลสรุปที่ไม่ได้กำหนด
13. หน่วยการแปล II - รวม โมดูล และเนมสเปซ
-
#include ปัญหา : รวมการป้องกัน, การประกาศไปข้างหน้า, การขึ้นต่อกันแบบวงกลม, ข้อผิดพลาดในการเชื่อมโยงทั่วไป - โมดูล C++20 : ภาพรวม คำศัพท์เฉพาะทาง การมองเห็นและความสามารถในการเข้าถึง ประเภทหน่วยของโมดูล คำสำคัญ ส่วนของโมดูลส่วนกลาง ส่วนของโมดูลส่วนตัว หน่วยโมดูลส่วนหัว พาร์ติชันของโมดูล
- การรวบรวมหน่วยการแปลหลายหน่วย : ธงคอมไพเลอร์พื้นฐาน วิธีการคอมไพล์
- ไลบรารีใน C++ : ไลบรารีแบบคงที่, สร้างไลบรารีแบบคงที่, การใช้ไลบรารีแบบคงที่, ไลบรารีแบบไดนามิก, สร้างไลบรารีแบบไดนามิก, การใช้ไลบรารีแบบไดนามิก, อินเทอร์เฟซไบนารีของแอปพลิเคชัน (ABI), การแยกส่วน, ค้นหาการพึ่งพาไลบรารีแบบไดนามิก, วิเคราะห์วัตถุ/สัญลักษณ์ที่ปฏิบัติการได้
14. อนุสัญญาด้านประมวลกฎหมาย I
- การจัดระเบียบโครงการ C++ : ไดเรกทอรีโครงการ, ไฟล์โครงการ, บันทึกย่อการจัดระเบียบโครงการ "ทั่วไป", ทางเลือก - การจัดระเบียบโครงการ "Canonical"
- รูปแบบการเขียนโค้ดและแบบแผน : ภาพรวม รูปแบบการเขียนโค้ดยอดนิยม
- ไฟล์ส่วนหัวและ
#include : #include guard, #include ไวยากรณ์, ลำดับของ #include , แบบแผนทั่วไปของชื่อไฟล์/แหล่งที่มา - การประมวลผลล่วงหน้า : มาโคร, คำสั่งการประมวลผลล่วงหน้า
- ตัวแปร : ตัวแปรส่วนกลาง
static , การแปลง - ตัวแจงนับ
- ประเภทเลขคณิต : ประเภทอินทิกรัลแบบมีเครื่องหมายและแบบไม่ได้ลงนาม, การแปลงประเภทอินทิกรัล, ประเภทอินทิกรัล: ขนาดและปัญหาอื่นๆ, ประเภทจุดลอยตัว
- ฟังก์ชัน : พารามิเตอร์ฟังก์ชัน อาร์กิวเมนต์ของฟังก์ชัน ค่าที่ส่งคืนของฟังก์ชัน ตัวระบุฟังก์ชัน นิพจน์แลมบ์ดา
- โครงสร้างและคลาส :
struct vs class , การกำหนดค่าเริ่มต้น, รายการตัวเริ่มต้นที่มีวงเล็บปีกกา, ฟังก์ชันสมาชิกพิเศษ, =default , =delete , ปัญหาอื่นๆ, การสืบทอด, Style
15. อนุสัญญารหัส II
-
auto - เทมเพลตและการหักประเภท
- โฟลว์การควบคุม : โฟลว์การควบคุมซ้ำซ้อน ,
if/else , การเปรียบเทียบ, switch , for/while - เนมสเปซ :
using namespace , เนมสเปซที่ไม่ระบุชื่อ/ไม่มีชื่อ, การออกแบบเนมสเปซและคลาส, สไตล์ - คุณสมบัติ C++ สมัยใหม่ : คำสำคัญ คุณลักษณะ คลาส ไลบรารี
- การบำรุงรักษา : ความเข้าใจโค้ด, ฟังก์ชัน, เทมเพลตและการดีบัก, ไลบรารี
- การพกพา
- การตั้งชื่อ : เอนทิตี ตัวแปร ฟังก์ชัน แบบแผนสไตล์ การบังคับใช้สไตล์การตั้งชื่อ
- ความสามารถในการอ่านและการจัดรูปแบบ : ระยะห่างแนวนอน ตัวชี้/อ้างอิง ระยะห่างแนวตั้ง วงเล็บปีกกา ตัวตกแต่งประเภท ลดการใช้คำฟุ่มเฟือยของโค้ด ปัญหาอื่นๆ
- เอกสารรหัส : เอกสารประกอบฟังก์ชัน, ไวยากรณ์ความคิดเห็น, เอกสารประกอบไฟล์
16. การดีบักและการทดสอบ
- ภาพรวมการดีบัก
- การยืนยัน
- การดีบักการดำเนินการ : เบรกพอยต์, จุดเฝ้าดู / จุดกักเก็บ, โฟลว์การควบคุม, สแต็กและข้อมูล, พิมพ์, แยกชิ้นส่วน,
std::breakpoint - การดีบักหน่วยความจำ :
valgrind - เทคนิคการทำให้แข็งตัว : การใช้สแต็ก, การตรวจสอบไลบรารีมาตรฐาน, การป้องกันพฤติกรรมที่ไม่ได้กำหนด, การป้องกันโฟลว์ควบคุม
- สารฆ่าเชื้อ : สารฆ่าเชื้อที่อยู่, สารฆ่าเชื้อที่รั่ว, สารฆ่าเชื้อในหน่วยความจำ, สารฆ่าเชื้อพฤติกรรมที่ไม่ได้กำหนด, สารฆ่าเชื้อแบบสุ่มตัวอย่าง
- สรุปการดีบัก
- คำเตือนของคอมไพเลอร์
- การวิเคราะห์แบบคงที่
- การทดสอบโค้ด : การทดสอบหน่วย, การพัฒนาที่ขับเคลื่อนด้วยการทดสอบ (TDD), การครอบคลุมโค้ด, การทดสอบ Fuzz
- คุณภาพรหัส :
clang-tidy
17. ระบบนิเวศ - Cmake และเครื่องมืออื่น ๆ
- CMake :
cmake และ ctest - เอกสารรหัส :
doxygen - สถิติโค้ด : นับบรรทัดของโค้ด, เครื่องวิเคราะห์ความซับซ้อนแบบไซโคลมาติก
- เครื่องมืออื่นๆ : การจัดรูปแบบโค้ด -
clang-format , Compiler Explorer , การแปลงโค้ด - CppInsights , การเติมโค้ดที่ขับเคลื่อนด้วย AI - การค้นหาโค้ดท้องถิ่น - ugrep , ripgrep , hypergrep , เครื่องมือค้นหาโค้ด - searchcode/grep.app , การวัดประสิทธิภาพโค้ด - Quick-Bench , แบบอักษรสำหรับการเข้ารหัส
18. สาธารณูปโภค
- สตรีม I/O : ตัวจัดการ,
ofstream/ifstream - สตริง :
std::string , การแปลงจาก/เป็นค่าตัวเลข, std::string_view , std::format , std::print - ดู :
std::span - ห้องสมุดคณิตศาสตร์
- ตัวเลขสุ่ม : แนวคิดพื้นฐาน, C++
<random> , Seed, ระยะเวลาและคุณภาพ PRNG, การกระจาย, อัลกอริธึมและประสิทธิภาพล่าสุด, สุ่มเสมือน - การวัดเวลา : เวลานาฬิกาแขวน, เวลาผู้ใช้, เวลาของระบบ
- เทมเพลตคลาส Std :
std::pair , std::tuple , std::variant , std::optional , std::any , std::stacktrace - ไลบรารีระบบไฟล์ : วิธีการสืบค้น, วิธีการแก้ไข
19. คอนเทนเนอร์ ตัววนซ้ำ และอัลกอริทึม
- คอนเทนเนอร์และตัววนซ้ำ
- คอนเทนเนอร์ลำดับ :
std::array , std::vector , std::deque , std::list , std::forward_list - คอนเทนเนอร์ที่เกี่ยวข้อง :
std::set , std::map , std::multiset - อะแดปเตอร์คอนเทนเนอร์ :
std::stack , std::queue , std::priority_queue - ใช้งานตัววนซ้ำแบบกำหนดเอง : ใช้งานตัววนซ้ำแบบง่าย
- หมายเหตุตัววนซ้ำ :
- วิธีการยูทิลิตี้ตัววนซ้ำ :
std::advance , std::next , std::prev , std::distance , วิธีการเข้าถึงคอนเทนเนอร์, ลักษณะตัววนซ้ำ - ไลบรารีอัลกอริทึม :
std::find_if , std::sort , std::accumulate , std::generate , std::remove_if - ช่วง C++20 : แนวคิดหลัก มุมมองช่วง อะแดปเตอร์ช่วง โรงงานช่วง อัลกอริธึมช่วง การกระทำของช่วง
20. หัวข้อขั้นสูง I
- Move Semantic : การอ้างอิง
lvalues และ rvalues , Move semantic, std::move , semantic การประกาศคลาส - การอ้างอิงสากลและการส่งต่อที่สมบูรณ์แบบ : การอ้างอิงสากล, กฎการยุบการอ้างอิง, การส่งต่อที่สมบูรณ์แบบ
- หมวดหมู่ค่า
-
& , && ผู้ผ่านการคัดเลือกและการโอเวอร์โหลด volatile - คัดลอก Elision และ RVO
- การหักประเภท : Pass by-reference, Pass-by-pointer, Pass-by-value,
auto deduction, auto(x) : Decay-copy -
const ความถูกต้อง
21. หัวข้อขั้นสูง II
- พฤติกรรมที่ไม่ได้กำหนด: พฤติกรรมที่ผิดกฎหมาย, พฤติกรรมเฉพาะของแพลตฟอร์ม, พฤติกรรมที่ไม่ได้ระบุ, การตรวจจับพฤติกรรมที่ไม่ได้กำหนด
- การจัดการข้อผิดพลาด : การส่งมอบข้อผิดพลาดที่สามารถกู้คืนได้, รหัสส่งคืน, ข้อยกเว้น C++, การกำหนดข้อยกเว้นแบบกำหนดเอง, คำหลัก
noexcept , ปัญหาการจัดสรรหน่วยความจำ, รหัสส่งคืนและสรุปข้อยกเว้น, std::expected , วิธีการจัดการข้อผิดพลาดทางเลือก - พอยน์เตอร์อัจฉริยะ :
std::unique_ptr , std::shared_ptr , std::weak_ptr - การเกิดขึ้นพร้อมกัน : วิธีการของเธรด, Mutex, Atomic, ความเท่าเทียมตามงาน
22. การเพิ่มประสิทธิภาพ I - แนวคิดพื้นฐาน
- บทนำ : กฎของมัวร์ ข้อจำกัดของกฎของมัวร์ เหตุผลในการปรับให้เหมาะสม
- แนวคิดพื้นฐาน : ความซับซ้อนเชิงซีมโทติก การแลกเปลี่ยนระหว่างหน่วยความจำเวลา วงจรการพัฒนา กฎของอาห์มดาล ปริมาณการประมวลผล แบนด์วิดท์ เวลาแฝง ขอบเขตประสิทธิภาพ ความเข้มข้นทางคณิตศาสตร์
- แนวคิดสถาปัตยกรรมพื้นฐาน : ปริมาณงานของคำสั่ง (IPC) การดำเนินการตามลำดับและการดำเนินการนอกลำดับ การวางท่อคำสั่ง ความขนานระดับคำสั่ง (ILP) กฎของลิตเติ้ล ความขนานระดับข้อมูล (DLP) และคำสั่งเวกเตอร์ (SIMD) ความขนานระดับเธรด (TLP), ชุดคำสั่งหลายเธรดคำสั่งเดี่ยว (SIMT), RISC, ชุดคำสั่ง CISC
- ลำดับชั้นของหน่วยความจำ : แนวคิดลำดับชั้นของหน่วยความจำ, ตำแหน่งของหน่วยความจำ, เวลาแฝงของคอร์ต่อคอร์ และความสัมพันธ์ของเธรด, โมเดลการเรียงลำดับหน่วยความจำ
23. การเพิ่มประสิทธิภาพ II - การเพิ่มประสิทธิภาพโค้ด
- การดำเนินการ I/O :
printf , I/O ที่แมปหน่วยความจำ, เร่งความเร็วในการโหลดข้อมูลดิบ - การเพิ่มประสิทธิภาพหน่วยความจำ : หน่วยความจำฮีป, หน่วยความจำสแต็ก, การใช้แคช, การจัดตำแหน่งข้อมูล, การดึงหน่วยความจำล่วงหน้า
- ประเภทเลขคณิต : ชนิดข้อมูล, การดำเนินการทางคณิตศาสตร์, การแปลง, จุดลอยตัว, ฟังก์ชันภายในของคอมไพเลอร์, ค่าในช่วง, ตารางการค้นหา
- โฟลว์การควบคุม : Branhes, Branch Hints -
[[likely]] / [[unlikely]] , จำนวนเต็มที่ลงนาม/ไม่ได้ลงนาม, ลูป, การยกแบบวนซ้ำ, การคลี่แบบวนซ้ำ, การยืนยัน, คำแนะนำของคอมไพเลอร์ [[assume]]/std::unreacheable() , การเรียกซ้ำ - ฟังก์ชัน : ค่าใช้จ่ายในการเรียกใช้ฟังก์ชัน, การส่งผ่านอาร์กิวเมนต์, การอินไลน์ฟังก์ชัน, คุณลักษณะของฟังก์ชัน, นามแฝงของพอยน์เตอร์
- การเขียนโปรแกรมเชิงวัตถุ
- ห้องสมุดมาตรฐานและด้านภาษาอื่น ๆ
24. การเพิ่มประสิทธิภาพ III - การเพิ่มประสิทธิภาพแบบไม่เข้ารหัสและการเปรียบเทียบ
- การเพิ่มประสิทธิภาพคอมไพเลอร์ : เกี่ยวกับคอมไพเลอร์, แฟล็กการปรับให้เหมาะสมของคอมไพเลอร์, แฟล็กการปรับให้เหมาะสมจุดทศนิยม, แฟล็กการปรับให้เหมาะสมของ Linker, แฟล็กสถาปัตยกรรม, ช่วยคอมไพลเลอร์ในการสร้างโค้ดที่ดีขึ้น, การเพิ่มประสิทธิภาพที่แนะนำโปรไฟล์ (PGO), โปรแกรมเพิ่มประสิทธิภาพไบนารี่หลังการประมวลผล, การเพิ่มประสิทธิภาพ Polyhedral
- เทคนิคการแปลงคอมไพเลอร์ : การแปลงพื้นฐาน, การคลายสวิตช์ลูป, ฟิวชั่นลูป, ฟิชชันแบบลูป, การแลกเปลี่ยนแบบลูป, การปูกระเบื้องแบบวนซ้ำ
- ไลบรารีและโครงสร้างข้อมูล
- การเปรียบเทียบประสิทธิภาพ : สิ่งที่ต้องทดสอบ, คุณภาพปริมาณงาน/ชุดข้อมูล, ลักษณะการทำงานของแคช, ประสิทธิภาพของ CPU ที่เสถียร, ข้อควรพิจารณาเกี่ยวกับมัลติเธรด, เค้าโครงหน่วยความจำโปรแกรม, โอเวอร์เฮดการวัด, การเพิ่มประสิทธิภาพคอมไพเลอร์, การประเมินหน่วยเมตริก
- การทำโปรไฟล์ :
gprof , uftrace , callgrind , cachegrind , perf Linux profiler - คอมพิวเตอร์แบบขนาน : การเห็นพ้องต้องกันกับความเท่าเทียม, การปรับขนาดประสิทธิภาพ, กฎของกุสตาฟสัน, ภาษาโปรแกรมแบบขนาน
25. การออกแบบซอฟต์แวร์ 1 - แนวคิดพื้นฐาน (DRAFT)
- หนังสือและข้อมูลอ้างอิง
- แนวคิดพื้นฐาน : นามธรรม ส่วนต่อประสาน และโมดูล คลาสไม่แปรเปลี่ยน
- หลักการออกแบบซอฟต์แวร์ : การแยกข้อกังวล การมีเพศสัมพันธ์ต่ำ การติดต่อกันสูง การห่อหุ้มและการซ่อนข้อมูล การออกแบบตามสัญญา การสลายตัวของปัญหา การใช้โค้ดซ้ำ
- ความซับซ้อนของซอฟต์แวร์ : เอนโทรปีของซอฟต์แวร์ หนี้ทางเทคนิค
- หลักการออกแบบ SOLID
- การออกแบบคลาส : หลักการอินเทอร์เฟซของคลาส ฟังก์ชันสมาชิกเทียบกับฟังก์ชันอิสระ ฟังก์ชันเนมสเปซเทียบกับเมธอดคลาสสแตติก
- กรณีศึกษาของบลาส เจมม์
- การเป็นเจ้าของวัตถุและมุมมอง
- ค่ากับความหมายอ้างอิง
- ตัวแปรร่วม
26. การออกแบบซอฟต์แวร์ II - รูปแบบการออกแบบและสำนวน (DRAFT)
- สำนวน C++ : กฎของศูนย์ กฎสาม กฎห้า
- รูปแบบการออกแบบ : ซิงเกิลตัน, ตัวชี้ไปสู่การใช้งาน (PIMPL), รูปแบบเทมเพลตที่เกิดซ้ำอย่างอยากรู้อยากเห็น (CRTP), ฟังก์ชันเสมือนของเทมเพลต
แผนการทำงาน
- ปรับปรุงบทการออกแบบซอฟต์แวร์
- บทที่แง่มุมของการสร้าง (เช่น การลดเวลาในการสร้าง)
รายงานข้อบกพร่อง ? และมีส่วนร่วม
หากคุณพบการพิมพ์ผิด ข้อผิดพลาดด้านแนวคิด หรือส่วนที่ต้องปรับปรุง โปรดรายงานโดยใช้แผง issue
ผู้เขียน
Federico Busato , https://federico-busato.github.io/
- ลิงค์อิน: www.linkedin.com/in/federico-busato/
- ทวิตเตอร์: twitter.com/fedebusato