從 Python 到 C++:為什麼差距那麼大
實際看看為什麼從 Python 轉到 C++ 會讓人卡關,以及學習時該實際關注什麼。
每個第一次接觸 C++ 的 Python 程式設計師都有相同的反應:為什麼列印「hello world」需要這麼多繁文縟節?這個跳躍不只是語法。這是一個在你如何思考記憶體、型別,以及程式執行時電腦實際在做什麼的轉變。
Python 為你隱藏了什麼
Python 執行在一個直譯器上方(多數情況下是 CPython),它在幕後處理記憶體配置、垃圾回收和型別檢查。當你寫 x = 5,然後稍後 x = "hello",Python 只是聳肩重新指派這個名稱。沒有抱怨,沒有你需要進行的清理。
C++ 不會為你做任何這些事。當你寫 int x = 5;,你已經保留了一個為整數大小的固定記憶體區塊。你以後不能把字串丟進去。當你用 new 動態配置記憶體時,你負責用 delete 釋放它——忘記這點,你就有了記憶體洩漏。忘記在取消參考指標前檢查它是否為 null,你就有了分段錯誤。Python 用效能換取安全網。C++ 把剪刀交給你並相信你不會亂跑。
靜態型別改變你寫程式的方式,不只是你宣告變數的方式
在 Python 中,函式簽名是建議。在 C++ 中,它們是在編譯時強制執行的約定:
int add(int a, int b) {
return a + b;
}
呼叫 add(3, "four") 而編譯器在程式執行前會停止你。Python 會樂意讓你寫 def add(a, b): return a + b,然後在有人傳入不相容的型別時在執行時爆炸。這不是小麻煩——這是一個關於錯誤何時應該浮現的不同哲學。C++ 想要你在編譯時捕捉錯誤。Python 可以在生產環境中捕捉它們,如果你沒有寫測試的話。
記憶體管理是真正的課程
最大的概念跳躍是理解堆疊對比堆積。本地變數和函式參數通常存在於堆疊上,當函式返回時它們會自動清理自己。任何用 new 建立的東西存在於堆積上,它會一直在那裡,直到你明確 delete 它或把它包裝在智能指標中。
現代 C++(C++11 以後)給你 std::unique_ptr 和 std::shared_ptr 特別是讓你不必那麼經常手動管理原始指標:
std::unique_ptr<int> ptr = std::make_unique<int>(42);
這個物件在它超出範圍時會銷毀自己——不需要手動 delete。如果你在 2024 年學習 C++,直接跳到智能指標和 RAII(資源獲取就是初始化)模式,而不是磨練為 1998 年課程設計的原始指標算術練習。你仍然需要從概念上理解指標,但你不需要寫 malloc/free 程式碼來證明它。
編譯是不同的反饋迴圈
Python 給你即時反饋:執行指令碼、看到錯誤、修正它、再次執行。C++ 在中間插入了一個編譯步驟,那個步驟捕捉一整類 Python 延遲到執行時的錯誤。用 g++ -Wall -Wextra program.cpp -o program 編譯並注意每一個警告會為你省下數小時困惑的偵錯。型別不匹配、未初始化的變數和帶符號/無符號比較問題都在這裡浮現,而不是神祕的執行時行為。權衡是迭代速度:你的編輯-編譯-執行迴圈比 Python 的編輯-執行迴圈慢,特別是在較大的程式碼庫中,完整重建可能需要幾分鐘。這是為什麼像 ccache 這樣的工具和透過 CMake 的增量構建在你的專案超過幾個檔案後很重要。
這在實務上實際上重要的地方
你不是為了更快地寫和你用 Python 寫的相同程式而學習 C++。你學它是因為某些問題需要它:有嚴格幀預算的遊戲引擎、只有位元組 RAM 的嵌入式系統、微秒成本金錢的高頻交易系統,或坐在 Python 直譯器本身下方的作業系統元件。如果你在做安全工作,理解 C++ 記憶體模型也直接說明了緩衝區溢位和釋放後使用漏洞在二進位級別如何發生——Python 的抽象主動向你隱藏的知識。
誠實的建議:不要試著讓 C++ 感覺像 Python。讓它對你不舒服一段時間。這種不舒服就是重點——它在教你你的 Python 直譯器一直在代表你做的是什麼。
如果這種語言對語言的比較有用,Korra Studio 有關於記憶體安全、系統程式設計基礎和反向工程的相關片段,建立在恰好這些概念上。
本文由 AI 協助撰寫,經 Michal Pilch(CISSP)審核並發佈,Korra Studio。
這是 Korra Studio 知識庫中的一篇筆記——該平台將每個主題與一對一的師資配對。
免費開始arrow_forward