全局变量C ++的分配

时间:2015-05-05 23:38:35

标签: c++ memory global-variables

当声明不同的方式以及哪种方式最好时,似乎不清楚全局变量的存储位置?

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

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

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

4 个答案:

答案 0 :(得分:2)

"存储变量的位置"通常是错误的问题。它在不同平台之间有所不同,而且语言旨在提供对这些细节的抽象。

示例1使用静态存储持续时间创建Rectangle对象。它通常会在main返回后自动销毁。

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

答案 1 :(得分:1)

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

使用第二个(指针本身)它是相同的,但指针指向的对象将在堆上分配。

答案 2 :(得分:1)

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

编译器会将编译单元划分为多个部分: - 可执行数据 - 只读数据 - 读写数据 链接器将收集具有相同属性的所有部分。在链接过程结束时,全局读/写数据通常会与读/写数据合并。

这会创建读/写数据。

 Rectangle rect(15,12);

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

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

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

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

答案 3 :(得分:0)

变量"存储的位置"是实现定义的,并且不在C ++标准的范围内,除了它们的范围的特定语义。

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