C++所相信的计算机谎言

发布时间 2024-01-05 10:11:54作者: deeplearnMs

C++ 程序至少会假装相信讲解过的简单的计算机基本模型中的一个版本。

中有可以以固定字符长度的字节为单位寻址,在本质上容量是无限的内存。有一个与其他
任何有效的内存地址都不同的特殊的地址,叫作 nullptr。整数 0 会被转换为 nullptr,尽
管在地址 0 上不需要 nullptr。有一个概念上的执行地址指向正在被执行的源代码语句。
各条语句会按照编写顺序执行,受到 C++ 控制流程语句的控制。
C++ 知道计算机远比这个简单模型要复杂。它在这台闪闪发亮的机器下提供了一些快
速功能。

 

  • 1.C++ 程序只需要表现得好像语句是按照顺序执行的。C++ 编译器和计算机自身只要能够确保每次计算的含义都不会改变,就可以改变执行顺序使程序运行得更快。
  • C++11 开始,C++ 不再认为只有一个执行地址。C++ 标准库现在支持启动和终止线程以及同步线程间的内存访问。 C++11 之前,程序员对 C++ 编译器隐瞒了他们的线程,有时候这会导致难以调试。
  • 某些内存地址可能是设备寄存器,而不是普通内存。这些地址的值可能会在同一个
    线程对该地址的两次连续读的间隔发生变化,这表示硬件发生了变化。在 C++ 中用
    volatile 关键字定义这些地址。声明一个 volatile 变量会要求编译器在每次使用该变
    量时都获取它的一份新的副本,而不用通过将该变量的值保存在一个寄存器中并复用它
    来优化程序。另外,也可以声明指向 volatile 内存的指针。
  • C++11 提供了一个名为 std::atomic<> 的特性,可以让内存在一段短暂的时间内表现得
    仿佛是字节的简单线性存储一样,这样可以远离所有现代处理器的复杂性,包括多线程
    执行、多层高速缓存等。有些开发人员误以为这与 volatile 是一样的,其实他们错了。
  • 操作系统也欺骗了程序和用户。实际上,操作系统的目的就是为了给每个程序讲一个让它
    们信服的谎言。最重要的谎言之一是,操作系统希望每个程序都相信它们是独立运行于计
    算机上的,而且这些计算机的内存是无限的,还有无限的处理器来运行程序的所有线程。
    操作系统会使用计算机硬件来隐藏这些谎言,这样 C++ 不得不相信它们。除了降低程序的运
    行速度外,这些谎言其实对程序运行并没有什么影响。不过,它们会导致性能测量变得复杂。