การเขียนโปรแกรม 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