全局变量的分配 C++

Allocation of global variables C++

似乎不​​清楚当以不同方式声明时全局变量存储在哪里以及哪种方式最好?

例如,每个示例中的变量存储在哪里,它们的作用域是什么?

//Example 1 (at the top of a cpp file): 
Rectangle rect(15,12);

//Example 2:
Rectangle *rect = new Rectangle(15,12);

其中变量 "get stored" 是实现定义的,不在 C++ 标准的范围内,除了它们范围的特定语义。

假设两个声明都是静态范围的,在这两种情况下 'rect' 都将存储在静态范围内。在第二种情况下,rect 将引用堆分配的对象,并且在应用程序的整个生命周期中,应用程序可能 delete 指针,and/or 重新分配它以指向此 [=18] 的其他实例=].

"Where are the variables stored" 通常是错误的问题。它因平台而异,语言旨在提供对此类细节的抽象。

示例 1 创建一个 Rectangle 具有 静态存储持续时间 的对象。一般会在main returns.

后自动销毁

示例 2 创建一个具有 动态存储持续时间 Rectangle 对象。每当您在指针上调用 delete 时(或者,可能显式调用析构函数),它都会被销毁;否则它不会被摧毁。非正式地,人们说动态存储持续时间的对象是 "on the heap",但这唤起的实现细节具有平台相关的含义。

如果第一个是在函数外定义的,它将被存储在数据段中。如果它是在函数中定义的,它将被存储在堆栈中。

与第二个(指针本身)一样,但是指针指向的对象将分配在堆上。

存在过度简化的风险。 . . .

编译器会将编译单元分成几个部分: - 可执行数据 - 只读数据 - 读写数据 linker 将所有具有相同属性的部分收集在一起。在 link 过程结束时,全局 read/write 数据通常会与 read/write 数据合并。

这将创建 read/write 个数据。

 Rectangle rect(15,12);

这将为 rect 创建 read/write 数据以及在启动时调用 new 的可执行数据。

Rectangle *rect = new Rectangle(15,12);

忽略调试信息,局部变量仅在编译期间具有作用域。编译后,局部变量只是[相对]内存位置。全局变量在编译后仍然可识别。在 linking 之后,全局变量基本上消失了。

(为简单起见,我忽略了通用符号和共享库。)