返回资讯中心
外部精选
软件工程
#开发者实时流

一篇观点文章主张:学C++能让人理解编程的底层代价

来源标题:Learn C++ Before You Learn What It Costs You

一篇技术观点文章主张,先学C++能让开发者看清代码背后的运行机制与成本,并永久改变其阅读其他语言的方式。作者用同一段问候函数的Python与C++写法对比,说明C++程序员能看到Python/Java/JS程序员忽略的底层细节。文章发表于2026年7月。

Hacker News 最新fagnerbrack2026/11/7 · 今天17 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

编程 Python JavaScript Java 在你了解代价之前,先学 C++ 一门能赋予你受用终身的根本性视角的语言 Fayner Brack 5 分钟阅读· 2026 年 7 月 13 日

一行“console.log”代码如同冰山一角,水面之下是庞大的机械结构 想稍后再读?把它保存到 readplace.com。 但关键在于,它会改变你余生阅读其他所有语言的方式。而且,你无法选择保留这种改变中的哪些部分。 关于 C++ 的大多数建议都止步于那一段。标准说法是:“它教你计算机真正如何工作”,然后递给你一本 Stroustrup 的书,祝你好运,别被模板报错搞疯。在 Python/Java/JS 岗位干了 5 年之后,你会睁眼看到同事们根本看不见的东西。 下面是我给任何问我“能收获什么”的人举的例子。 def greet(name): print(f"Hello, {name}") greet("Faye") void greet(const std::string& name) { std::cout << "Hello, " << name << "\n"; greet("Faye"); 一个 Python/Java/JS 程序员读第一段,看到的是一个打印问候语的函数。这没错,因为代码里没有任何东西需要别的解释。 一个 C++ 程序员读第二段,能看出许多决策: a) 字符串通过引用而非值传入,所以调用点不会发生拷贝,而前面的 const 是对调用者的承诺:函数不会改动他们的数据。 b) 参数是 std::string,但 "Faye" 不是,所以编译器会构造一个临时的 std::string 只是为了绑定到那个引用上,而这个临时对象会存活到整个表达式结束。 c) std::cout 不是函数。它是一个全局对象,拥有一个位于程序和终端之间的缓冲区,写入它只是把字节移入缓冲区,而不是直接送到屏幕上。 d) << 是左移运算符,就是移位那些神秘零和一的那个。C++ 允许重载运算符,所以标准库给 << 在流上安排了第二份工作。 e) 那一行里每个 << 都不是字符串拼接,而是一次函数调用,写入一个东西到流并返回流,这正是三个 << 能从左到右串联的唯一原因。编译器为字面量选的 operator<< 与为 std::string 选的不同,而且两者都在程序运行前就选好了。 f) 末尾的 "\n" 把一个字符放进缓冲区就停了。std::endl 会放入同样的字符,然后把缓冲区推给操作系统。在一个运行一百万次的循环里,这个差别以秒计。 第一个版本更短。C++ 版本教你的,正是第一个版本所隐藏的东西。 现在用 C++ 的眼睛再读一遍 Python 版本。不,不是像 Java 那样,他们得戴眼镜,因为他们不能 C# 🥁。 免费加入 Medium,获取这位作者的更新。 字符串是一个堆分配的对象,带有一个引用计数,进入函数时计数会增加。它分配第二个对象并拷贝进去,而 print 调用在哪怕一个字符移动之前,先对 stdout 加锁。 你看不见这些,但每次调用它都在运行。 C++ 教的东西是其他主流语言不教的(至少没这么深入),而一旦你学会了,就很难忘记(不幸的是)。 第一是手动内存管理。其他所有流行语言都自带垃圾回收器、借用检查器或引用计数,让程序员忘记对象存在于物理内存的某处。C 是个例外,它比 C++ 更直白地教手动内存,没有析构函数和智能指针来缓和,但它就到此为止了。 第二是值语义与引用语义的区别。在 Python 里每个变量都是绑在对象上的标签,而在 C++ 里变量可以是事物本身、指向它的指针,或对它的引用。这些在每次拷贝、赋值和函数调用中行为都不同,而一整类高级别 bug 都源于不知道当前是哪种在起作用。 第三是抽象的成本。一次 push_back 可能重新分配并拷贝它已有的每个元素。一次虚调用要付出指针追逐的代价,而 std::function 对任何放不进内联存储的捕获都会在堆上分配(而大多数都放不进)。 总之……我能一直说下去……重点是:C++ 不隐藏这些东西,而且…… ……不看见它们,你就无法完全理解代码。 我听过资深工程师笑着说“C++ 把我给 Python/JS 毁了”。那种笑法,是人们对其实为真的事情的笑。 但一门语言怎么会毁掉你对另一门语言的感觉?基本上是通过一层你关不掉的模式识别。几年 C++ 积累的知识会跟着你进入之后的每一门语言。 你能在列表推导式里看到分配。拷贝藏在函数参数里,却依然显眼。一个 Pandas 操作在你测量之前就已经被标记为昂贵。 这有时是超能力。你手写的 Python 比周围的人快,不是靠技巧,而是靠避开一看就昂贵的形状。你知道哪些抽象是免费的,哪些会生成长期债务。 不过也不全是彩虹和阳光。同样的好处也带着代价。 你读到干净、地道、完全没问题的代码,却得压住重写的冲动。你看着同事把一个 50MB 的字典穿过 3 层函数,内心深处的某个东西被触动了,尽管代码只是传了个指针,什么都没移动……我花了好些年训练自己在那些成本不重要、我也不太在乎的语言里对此闭嘴,这让我能思考现实生活而非技术纯洁性,对我很有帮助。 尽早学 C++,在你的习惯定型之前,在围绕某门高级语言形成身份认同之前。如果船已开走,就在工作之外花些时间和它相处,写点自己管理内存的东西,然后读《Effective C++》,直到你感觉被它人身攻击。

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →