From fb9ad5df4360cd74ee8a82c9a4ba49c3dcc97fba Mon Sep 17 00:00:00 2001 From: Awin Huang Date: Sun, 4 Jan 2026 23:07:09 +0800 Subject: [PATCH] =?UTF-8?q?Add=20"2026-01-04=5F=E7=94=A8=20Modern=20C++=20?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E5=BC=8F=E5=AF=AB=E7=A8=8B=E5=BC=8F=E5=90=A7?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../featured.png | Bin 0 -> 17941 bytes .../index.md | 214 ++++++++++++++++++ 2 files changed, 214 insertions(+) create mode 100644 content/posts/2026/2026-01-04_用 Modern C++ 的方式寫程式吧/featured.png create mode 100644 content/posts/2026/2026-01-04_用 Modern C++ 的方式寫程式吧/index.md diff --git a/content/posts/2026/2026-01-04_用 Modern C++ 的方式寫程式吧/featured.png b/content/posts/2026/2026-01-04_用 Modern C++ 的方式寫程式吧/featured.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5dec1fa62756c6c7d0357a3671515c83db2798 GIT binary patch literal 17941 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ͪN~ z=R9qS`g`v4CZA&ELDBCulh&0TJH%LZ}JA^q)m&G>O|O&EjV7oZ2g+g zNQ+JTG<)zi23!p}Vr%q9<_lWQh@5}X!nSweP@Kpxpc6k zz=X^T$)H)eZrifnLX5YQ4EX*(TPtO$OO|u$&r+BBxJi_Lw;Pc#(;Aca{j?XGA7VHG z0UuqsNlVL^9%4LeTeu&-4oN`NptSjp_BXT8YG5a%9KGl-^eEvLSH+E#EQ}*_PPHua zo)@=-tPF4U(;&ucyypuP)Q>Hzy!ZtyuVK)FZQ^nWQ8bR?HB zEnQ!18N8Op`?wAc`=ZNcf-_CRQE;q+c8nEbc22dAzdfPFJV$l_lVQow*7tlV5mGQR zZ4vTVD5Oe$d6Bxkp8BuNjL(S{elK^4vM>y~h_mD&HwR!qAEuT37WTGkZ;AE;YgDgq zX@@NRVIY&XYHOm&%r zZD^@*`m^QMYMriX@*r*4DbpUvfAg(GGe~>>W$evM@6Y^Wl>$XGOxEFJ zZ}+s^%^CHdEmtel&$i=k4yqH{TaRjgvD>;KSF2z^t%xpbT-6KPUeG!8Qozt_v9tZ#U6joTt;0(0OCmr zb-R=(1%X4E z9bDlXJGsKO4Apu{2ujaQ*63NWDA$!St{D~s9o-nIZF!o{iys7D6T?ZOL7>fXSzl;n zv(}BP^W_q$h`y3H9X?*bd&er{XNp!N2Gz@3E@M4`Zt!6AjqxRRC@gN<{!2>0AV$;?)&GVm03T*+ zrV*&0f!V}4z_>D$?fMl#cnk0R*V25*TD(r{gbXeGBV}F##{CO1{i9-YiEwpbKn5vG zu5*Q(ecbA7e#|jTE!D@y&s1z(0s-wglDQ>14%YHv|2!A-508aO|DQw`vg-i3nc5Yg z(B8-O*n|B-(Bu67qyp-godD5$i6mpb>|b*Z#hzXq1M#MFUJPU<|7U;@9el&=*ndk~ z+I0Z$Zd4#Xz39O?!dHG?qc~@3CfE__%a2=-pHb73e*fCi|D1XH@zmemsNL}NB%<}y zz))qmsQ|9Z)MNN)(HwyKS&SJxZ?q-a`A=kW@7Ve$Ac55ZaskX1`_jo!+iNJs-_!-j zvdyINU=529^NpgF$k{E6jiNOloh_kW8&-o?2DZQ{lr?I6>1P0s1$+ouu|xWSoazEC zt`Dq1Mr}F#vkgI{z;16~LE-u@^x6hDRP(=Zr_H36_5A|h=Gzp0&~;AH8r8Zy#%=T^ zF?6hegA4FOfK>ud-%K;zNZXV#|7yp5n_ProzXk5$f`asQ47eB}6O8XAL3rzZMJn}9 zGU_3I_SkzKhx&>G8Vja3UZnenDIDSq+k_;WeNJ&bH8^c@ygM4HT|}?Q%Bf&yeAsfj zs?(4vJ@t7beHHPnDjI%$_+#wz>kjsYyQx+C0aV912I=SWu%(z$8R(8j*SOqq_2q15CdXzJAF=gmKwRk`^;pzF_*$q~Udha>rEa><^#S@XZpQvegRz9Y}2(K%`0I#I9a0V+6Y9(`%x?FyB zRl9(W{5X>7i>{~(ug?q|%`UjhE*vI%FNrUbN)exD=zZY^C7!x!qtec%ch%TwA65=g zqr$sJ#bI+z_#r6r6xZ|7#_)4Eaj{LwyI1E>1F4xAWCTS)RV;#9Cf|#4{BM!PQ)=GqipfQ-tW!HXNhdX-s*kyL#116qu`h zSDzUwk#12@c`Cnb&XTk_Ev>Hbk%azU15KKVkyCdcT`uxQ;@B@e-4+L>@KqGYE1ftC zYi>b%Rm_Ax440uJXf0(Dc_sNnjjN~t1__Pl!mMzU z9)r`mIM>sB7PU>e__VpJz%Y>`8T!5Yc@i-C?Hcm1E+TP?*!N8AJ`3Zaq&gakr?Tc^ zY{lGB&;3w_p+szw1iY`3I#eZEgfwm#uz*iahX4IyiIR8EegyJBkq-91TPYgbhb1P4 zFJk(fpK8pa!8NzbTz^^Q1#zGtkF##9}@xE~74E4-HKc8B5a6 zh2f|7LO?%kb0M-NmKWcf6rKp)yt!@=r0(#nF3NLIBd5-wAb9!q=6=VTiZu_jQ*xD< zGlS0l1h+n2M%!`YyJ|o#qb{Z0g_c{*5s|!$7nNJ5u5M(*Y%N0G@Lw%~Ol~p=KZNAe zQ3&&l(z+&&#?w57x*#p63~lZY{VusA{x!HqVLMz<*P6*B$osb1mi8a~zpfnmLpQWn8esM8x?j+aJ#GwwZFQC$2o_)QL-vLWGGUEYhuIuyc-;jXq+ z6g(t0&S}n|*B}GOIBWX0*;^~4&}DLcA}W-XO~+)Gz+%gbTS^ z&u8<#+INVMXpLTJ*Tuo<+-Aw9&F`ssB9^-Vth=WbhY2c=2xEd6Wm~&C9 zoC~yJga<+T+?*JkA#llW&tlXG0CIWbtFyP9YbvTY&Od3^hFTwgmgcC2Jr-$XpsaJa zth7!)r%p%29&||*c%Ku-Q6~@!?Yr7K-z4kqY8-$eMPJ-rgoLhDh_ z3fjOTBG&x>B%qWkh=?M-;ML7wH@ujjy((hT0pV4eHVT`qf=~TeSK*;H|5Z`iRa8Zn xrQnX#iPrVG7T#Q>dXeBrNF){H{$pF)+j=(%Zj+X1e*5>zC7X*C7jEAEe*oRp)(QXs literal 0 HcmV?d00001 diff --git a/content/posts/2026/2026-01-04_用 Modern C++ 的方式寫程式吧/index.md b/content/posts/2026/2026-01-04_用 Modern C++ 的方式寫程式吧/index.md new file mode 100644 index 0000000..ecd8c4f --- /dev/null +++ b/content/posts/2026/2026-01-04_用 Modern C++ 的方式寫程式吧/index.md @@ -0,0 +1,214 @@ +--- +slug: "[C++ 筆記] 用 Modern C++ 的方式寫程式吧" +title: "[C++ 筆記] 用 Modern C++ 的方式寫程式吧" +description: +toc: true +authors: + - awin +tags: + - c++ +categories: + - Programming +series: + - C++ 筆記 +date: 2026-01-04T00:00:00 +lastmod: 2026-01-04T00:00:00 +featuredVideo: +featuredImage: +draft: false +enableComment: true +--- + +## Modern C++ 已經改變很多了 + + + +### 歷史包袱的重量 + +C++ 一直在相容性上不遺餘力,舊的語法能跑,新的語法與關鍵字又一直疊加,最後呈現出來的就是複雜。作為一個長久以來的使用者,看著其他程式語言的崛起與更新,雖然在理性上很能夠理解,但是情感上還是會想掙扎一下,讓我們看看 Modern C++ 改變的那一面,拋棄到舊的習慣,讓我們可以在不失去效能的情況下,用「比較輕鬆」的方式來寫 C++。 + +## Modern C++ 的改變 + +### 1. 記憶體管理 + +**告別手動記憶體管理(`new`/`delete`)** + +```cpp +// 舊式 C/C++ 方式 +BigBuffer* buffer = new BigBuffer(size); +// ... 使用 buffer +delete buffer; // 容易忘記,造成記憶體洩漏 + +// Modern C++ 方式 +auto buffer = std::make_unique(size); +// 自動管理記憶體,無需手動 delete +``` + +**使用 Smart Pointer** + +- `std::unique_ptr`:獨佔所有權 +- `std::shared_ptr`:共享所有權 +- `std::weak_ptr`:弱引用,避免循環依賴 + +### 2. 用容器取代原生陣列 + +```cpp +// 危險的 C 陣列 +int arr[100]; // 無邊界檢查,容易越界 + +// 安全的 Modern C++ 容器 +std::array arr; // 編譯時大小固定 +std::vector vec; // 動態大小 +``` + +### 3. 自動型別推導 + +C++ 11 開始支援 [`auto`](https://en.cppreference.com/w/cpp/keyword/auto.html) 關鍵字 + +```cpp +// 舊的方式,冗長的型別宣告 +std::vector::iterator it = vec.begin(); + +// 簡潔的 auto +auto it = vec.begin(); + +// 結構化綁定(C++17) +auto [key, value] = map_pair; +``` + +### 4. 現代迴圈語法 + +```cpp +// 傳統 C 風格迴圈 +for (int i = 0; i < arr.size(); ++i) { + process(arr[i]); +} + +// Modern C++ 範圍迴圈 +for (const auto& elem : arr) { + process(elem); +} +``` + +### 5. Lambda 表達式 + +```cpp +// 傳統函式物件 +struct Comparator { + bool operator()(int a, int b) const { + return a < b; + } +}; + +// Modern C++ Lambda +auto compare = [](int a, int b) { return a < b; }; +``` + +## Modern C++ 的其他好東西 + +### 使用 `std::optional` 明確表達「可能為空」的情況 + +```cpp +std::optional findValue(const std::map& mapping, int key) { + auto it = mapping.find(key); + if (it != mapping.end()) { + return it->second; // 找到了,返回值 + } + return std::nullopt; // 沒找到,返回空值 +} + +// 使用前必須檢查 +auto value = findValue(numbers, 42); +if (value.has_value()) { + std::cout << "Found value:" << value.value() << std::endl; +} +``` + +像 Python 可以 `return None` 來表示空值,`std::nullopt` 也提供了一個表達空值的方式。 +傳統的方式只能像是: +```cpp +bool findResult(const std::vector& mapping, int target, int& result) { + for (const auto& value : mapping) { + if (value == target) { + result = value; // 找到了,設置結果 + return true; // 返回成功 + } + } + return false; // 沒找到,返回失敗 +} +``` + +### `constexpr` 可以在編譯時計算 + +```cpp +constexpr int factorial(int n) { + return (n <= 1) ? 1 : n * factorial(n - 1); +} + +// 在編譯時就能計算出結果 +constexpr int fact5 = factorial(5); // 編譯時計算為 120 +``` +### 用 `using` 簡化程式 + +`using`(稱為型別別名,Type Alias)和 `typedef` 的功能基本上是一樣的:它們都是為現有的型別建立一個「別名」,而不是建立新的型別。 + +- **`using`:** `using [新名字] = [舊型別];` +- **`typedef`:** `typedef [舊型別] [新名字];` // 比較不直覺 + +`using` 有一個 `typedef` 做不到的是模板別名(Template Alias)。 + +例如 +```cpp +template using Handler = std::function; +Handler intHandler; +``` + +用 `using` 來簡化 `std::function` 的例子。例如說我們的參數是一個 callback function +```cpp +void setOnProgress(std::function callback) { + progressCb = callback; +} + +// 用 using 簡化 +using ProgressCallback = std::function; + +void setOnProgress(ProgressCallback callback) { + progressCb = callback; +} +``` + +### 表達力 + +Modern C++ 讓程式碼更接近自然語言: + +```cpp +auto result = numbers + | std::views::filter([](int x) { return x % 2 == 0; }) // 挑偶數 + | std::views::transform([](int x) { return x * x; }) // 轉平方 + | std::ranges::to(); // 直接收進 vector +``` + +C++23 加入了 [`std::ranges::to`](https://en.cppreference.com/w/cpp/ranges/to.html) +更重要的是不用再寫一堆 Iterator。 + +### 效能 + +Modern C++ 的效能提升,精確來說是實踐了 **「零成本抽象(Zero-overhead abstraction)」**。 + +- **`constexpr`**:這真的很好用。能把計算直接塞進編譯階段,執行時完全不用花 CPU 時間。到了 C++20 更有 `consteval` 強制編譯期計算。 +- **移動語意 (Move Semantics)**:這是 C++ 的續命符。它解決了以前回傳大型物件時,為了怕拷貝太慢得傳指標或寫得扭扭捏捏的問題。現在直接 `return` 沒負擔。 + +## 試試看吧,漸進式升級 + +一開始先試著用 `std::array` 或 `std::vector` 來取代傳統的 array。 +然後用 smart pointer 來取代 `new/delete`。 +過程中用 `auto` 來少打一些字。 +用 `using` 來簡化落落長的型別。 +用 Lambda 來簡化 callback(不用在遠遠的地方定義 function)。 + +試試看,當冗長的 code 變得清爽,思路也比較不容易打結。 + +## 最後 + +雖然 C++ 還是有很多可以改進的地方,例如 package 的使用跟 Python 相比就麻煩很多。 +但還是有在改變,試試看吧。