Menu

C++ 是什么?语言特点、运行速度与用途

C++ 到底是什么,它为什么能直接编译成本地机器码,以及人们用它来构建哪些高性能软件。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

一句话说清 C++

C++ 是一门静态类型的编译型编程语言,它把你的源代码直接转换成本地机器码。正是这一个设计选择(程序和 CPU 之间没有解释器,也没有虚拟机)让 C++ 成为你能用的最快的语言之一,也让它成为那些绝对不能慢的软件背后的语言。

下面是必不可少的第一个程序,直接在这里运行它:

这里的结构比脚本语言多,这是有意为之:C++ 要求你把一切写清楚,作为交换,你获得了精确的控制力。接下来的几页会把这段代码的每个部分都讲清楚。

C++ 为什么快

大多数脚本语言通过解释器或虚拟机来运行代码,在运行时读取并执行指令。C++ 跳过了这一切:

  1. 编译器(例如 g++ 或 clang++)读取你的 .cpp 源文件,把它翻译成针对某一种处理器和操作系统的机器指令。
  2. 结果是一个独立的可执行文件,由 CPU 直接运行,你的代码和硬件之间没有任何东西。

因为程序运行时不需要做任何翻译,C++ 程序启动迅速,并能以处理器的全速运行。你还能对内存和硬件进行细粒度的控制,而这些正是高级语言刻意对你隐藏的。

代价是:机器码是为某一个平台构建的。在 Windows 上编译出的可执行文件无法在 Mac 上运行,你需要针对每个目标平台重新编译源代码。(相比之下,Java 会编译成可移植的字节码,能在任何 JVM 上运行。)

静态类型与多范式

有两个特性决定了 C++ 代码的样子和写法。

静态类型意味着每个变量的类型在编译时就已确定,编译器会在程序运行之前检查你的类型:

count 在整个生命周期里都是 int;试图把 "hello" 存进去是无法通过编译的。这能及早发现一大类错误,代价是前期要多写一些代码。

多范式意味着 C++ 不强迫你使用某一种风格。你可以写普通的过程式代码,可以把逻辑组织成类(面向对象),也可以用模板编写泛型的、可复用的代码。大多数真实的程序三者兼而有之。这种灵活性很强大,但也意味着 C++ 要学的东西很多,我们会一次讲一个概念。

C++ 能用来做什么

只要性能和控制力是硬性要求,就会看到 C++ 的身影:

  • 游戏引擎:Unreal Engine、Unity 的核心,以及大多数 3A 游戏的代码。
  • 系统软件:操作系统、设备驱动程序,以及 Chrome 和 Firefox 这样的浏览器。
  • 高性能服务:数据库、交易系统,以及每一微秒都很重要的搜索基础设施。
  • 嵌入式与硬件:汽车、无人机、医疗设备和物联网设备的固件。

如果一款软件必须够快、必须塞进很小的内存,或者需要直接与硬件打交道,那它很可能就是用 C++ 写的。

C++ 不是 C(但它源于 C)

C++ 在 20 世纪 80 年代从 C 发展而来,最初叫“带类的 C”,至今基本上仍是 C 的超集:很多合法的 C 代码都能当作 C++ 编译。但从那以后,这门语言已经有了巨大的发展。

C++ 增加了面向对象编程、用于泛型代码的模板、引用、异常,以及一个装满现成工具的丰富标准库。下面这段代码用到了其中之一:vector,一个会自己管理内存的可变大小数组,在 C 中你得亲手实现它:

现代 C++(C++11、C++17 和 C++20 标准)大量依赖这类工具,让这门语言比它的 C 语言根源更安全、表达力更强。初学者的一个常见错误是写 C 风格的 C++:手动管理内存,到处都是原始数组,而标准库其实早已替你解决了这些问题。本文档会始终采用现代的写法。

常见问题

C++ 能用来做什么?

C++ 驱动着那些对速度和控制力有要求的软件:游戏引擎(Unreal、Unity 的核心)、操作系统、浏览器(Chrome、Firefox)、数据库、交易系统和嵌入式设备。它的优势在于既能贴近硬件运行,又提供类、模板和标准库这样的高级特性。

C++ 是编译型语言还是解释型语言?

C++ 是编译型语言。g++ 或 clang++ 这样的编译器会把你的源代码直接翻译成针对特定 CPU 和操作系统的本地机器码,生成一个独立的可执行文件。你的程序和处理器之间没有解释器或虚拟机,这就是 C++ 如此快的原因。

C 和 C++ 有什么区别?

C++ 最初是“带类的 C”,基本上是 C 的超集,所以大多数 C 代码都能当作 C++ 编译。主要的新增内容包括面向对象编程(类和继承)、模板、标准库(vector、map 等容器)、引用、异常,以及很多 C 所没有的安全性和便利性特性。

Coddy 编程语言插图

和 Coddy 一起学编程

开始