arrow_back返回现场笔记
COMPUTER SCIENCE 已发布 8 Aug 2026

从 Python 到 C++:为什么差距看起来这么大

实际看一下为什么从 Python 转向 C++ 会让人困惑,以及学习它时应该真正关注什么。

每个第一次接触 C++ 的 Python 程序员都有同样的反应:为什么打印一个 "hello world" 需要这么多步骤?这个跳跃不仅仅是语法。这是你需要如何思考内存、类型以及计算机在运行你的程序时实际在做什么的转变。

Python 为你隐藏了什么

Python 运行在一个解释器(大多数情况下是 CPython)之上,该解释器在后台处理内存分配、垃圾回收和类型检查。当你写 x = 5 后来又写 x = "hello",Python 只是耸耸肩并重新分配这个名称。没有抱怨,不需要你进行任何清理。

C++ 不会为你做这些。当你写 int x = 5; 时,你已经为一个整数预留了一个固定的内存块。你之后不能把字符串倒进去。当你用 new 动态分配内存时,你有责任用 delete 释放它——忘记了,你就有了内存泄漏。忘记在解引用指针前检查它是否为空,你就会得到段错误。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_ptrstd::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 增量构建一旦你的项目增长超过几个文件就变得重要了。

这在实际中的作用

你学 C++ 不是为了用它更快地写你用 Python 写的相同程序。你学它是因为一些问题需要它:具有严格帧预算的游戏引擎、只有几千字节 RAM 的嵌入式系统、微秒值钱的高频交易系统或位于 Python 解释器本身下方的操作系统组件。如果你在做安全工作,理解 C++ 内存模型也直接解释了缓冲区溢出和释放后使用漏洞如何在二进制级别发生——这是 Python 的抽象主动对你隐藏的知识。

诚实的建议:不要试图让 C++ 感觉像 Python。让它不舒服一段时间。这种不舒服就是关键——它在教你你的 Python 解释器代表你一直在做什么。

如果这种语言对语言的比较有用,Korra Studio 有关于内存安全、系统编程基础和逆向工程的相关内容,它们建立在完全相同的概念之上。

本文由人工智能协助撰写,经 Michal Pilch(CISSP)审核并发布,Korra Studio。

准备好更进一步了吗?

这是来自 Korra Studio 知识库的笔记之一——该平台将每个主题与一对一指导相结合。

免费开始arrow_forward