C++ 是支援多範式 (程序、物件導向、泛型、函數式) 的靜態型別通用語言,擁有 ISO 國際標準、龐大生態與工業級工具鏈。本文為開發者構建從語言核心到工程落地的完整知識體系,涵蓋現代 C++ 特性、標準庫精華、建構系統、測試策略、效能分析、部署運維五大維度。
| 特性類別 | 關鍵特性 | 工程價值 |
|---|---|---|
| 型別系統 | auto / decltype / decltype(auto) |
減少冗長型別宣告、完美轉發保留值類別 |
Concepts (C++20) / requires 子句 |
樣板制約可讀化、編譯期錯誤訊息人類可讀 | |
std::variant/any/optional/expected (C++23) |
類型安全聯合、無效狀態顯式化、錯誤處理無異常 | |
| 資源管理 | 智慧指標 (unique_ptr/shared_ptr/weak_ptr) |
RAII 自動化、所有權語義明確、循環引用可破解 |
std::span (C++20) / string_view (C++17) |
非擁有視圖、零拷貝介面、緩存友善 | |
std::scope_exit/scope_fail/scope_success (C++23) |
結構化延遲執行、異常安全無樣板雜訊 | |
| 泛型與元編程 | 變數樣板 (C++14) / 折疊運算式 (C++17) | 編譯期計算表達力質變、遞歸樣板簡化 |
if constexpr (C++17) / consteval/constinit (C++20) |
編譯期分支、強制常數求值、靜態初始化保證 | |
| 模組 (C++20) / 標頭單元 | 編譯防火牆、消除巨集污染、建構加速 | |
| 並發與同步 | std::atomic 記憶體序 / thread_local |
無鎖基礎、執行緒隔離狀態、偽共享避免 |
std::latch/barrier/counting_semaphore (C++20) |
高層同步原語、階段協調、資源池控制 | |
協程 (C++20) / std::generator (C++23) |
非同步序列、狀態機自動生成、堆疊less |
需要關聯查找? → 是 → 有序? → 是 → std::map/set (RB-tree, O(log n))
否 → std::unordered_map/set (Hash, O(1) 平均)
否
需要隨機存取? → 是 → 大小固定? → 是 → std::array (棧上、零開銷)
否 → std::vector (動態、連續、緩存友善)
否
需要雙端操作? → 是 → std::deque (分段連續、雙端 O(1))
否
需要頻繁中間插入刪除? → 是 → std::list/forward_list (節點基礎、迭代器穩定)
否
特殊需求? → 緩存友善迭代 → std::vector + 索引 / SOA 佈局
固定大小高效能 → boost::static_vector / folly::FixedString
多執行緒併發 → tbb::concurrent_vector / folly::ConcurrentHashMap
#include
#include
auto result = data
| std::views::filter([](auto x){ return x.active; })
| std::views::transform([](auto x){ return x.value * 2; })
| std::views::take(100)
| std::ranges::to(); // C++23
// 等價傳統寫法 (冗長、易錯、難讀)
std::vector result;
std::copy_if(data.begin(), data.end(), std::back_inserter(result),
[](auto x){ return x.active; });
std::transform(result.begin(), result.end(), result.begin(),
[](auto x){ return x.value * 2; });
result.resize(std::min(result.size(), size_t(100)));
# CMakeLists.txt 根目錄
cmake_minimum_required(VERSION 3.20)
project(MyProject VERSION 1.0.0 LANGUAGES CXX
DESCRIPTION "Modern C++ Project Template")
# 標準與警告
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
if(MSVC)
add_compile_options(/W4 /WX /permissive- /EHsc /external:W0)
else()
add_compile_options(-Wall -Wextra -Wpedantic -Werror -Wno-unused-parameter)
endif()
# 配置型別
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -fno-omit-frame-pointer -fsanitize=address,undefined")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -g -DNDEBUG -fomit-frame-pointer")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG")
# 依賴管理 (範例: vcpkg)
# set(CMAKE_TOOLCHAIN_FILE ${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake)
# find_package(fmt CONFIG REQUIRED)
# find_package(spdlog CONFIG REQUIRED)
# 子目錄
add_subdirectory(src)
add_subdirectory(tests)
add_subdirectory(examples)
jobs:
build:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
compiler: [gcc, clang, msvc]
build_type: [Debug, Release]
include:
- os: ubuntu-latest; compiler: gcc; cc: gcc; cxx: g++
- os: ubuntu-latest; compiler: clang; cc: clang; cxx: clang++
- os: macos-latest; compiler: clang; cc: clang; cxx: clang++
- os: windows-latest; compiler: msvc; cc: cl; cxx: cl
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Configure
run: cmake -B build -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DCMAKE_C_COMPILER=${{ matrix.cc }} -DCMAKE_CXX_COMPILER=${{ matrix.cxx }}
- name: Build
run: cmake --build build --parallel
- name: Test
run: ctest --test-dir build --output-on-failure --parallel
- name: Static Analysis
run: |
cd build
run-clang-tidy.py -p . -checks='modernize-*,performance-*,readability-*,bugprone-*'
| 層級 | 範圍 | 工具 | 特徵 | 比例 |
|---|---|---|---|---|
| 單元測試 | 函式/類別/模組 | GoogleTest, Catch2, Doctest | 快速、隔離、決定性、高覆蓋率 (>80%) | 70% |
| 整合測試 | 模組間交互/外部依賴 | GoogleTest + Testcontainers / Mock | 真實資料庫/網路/檔案系統、較慢 | 20% |
| 契約測試 | API/介面相容性 | Pact, OpenAPI 驗證 | 生產者/消費者契約、防止破壞性變更 | 5% |
| 端到端/系統測試 | 完整業務流程 | Playwright, 自動化腳本 | 真實環境、極慢、脆弱、關鍵路徑のみ | 5% |
| 模糊測試 | 邊界/異常輸入 | libFuzzer, AFL++, Honggfuzz | 自動生成惡意輸入、發現安全漏洞/崩潰 | 持續 |
| 屬性測試 | 不變量/代數性質 | RapidCheck, PropCheck | 從規格推導測試案例、補充範例測試盲區 | 補充 |
-fPIC (Linux/macOS 動態庫), /DYNAMICBASE (ASLR), /NXCOMPAT (DEP)strip --strip-unneeded (保留除錯資訊單獨發布 .dbg/.pdb)ldd (Linux), otool -L (macOS), dumpbin /DEPENDENTS (Windows)C++ 開發不是單點技能堆疊,而是語言機制、標準庫慣用法、工具鏈工程化、軟體架構原則、領域知識的系統性整合。持續在這五個維度精進,你將能應對從嵌入式韌體到分散式基礎設施的全譜系挑戰。