繁体   English   中英

全局变量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);

“将变量存储在哪里”通常是错误的问题。 在不同的平台上,它是不同的,并且该语言旨在始终以这种细节提供抽象。

示例1创建一个具有静态存储持续时间Rectangle对象。 通常在main返回后它将自动销毁。

示例2创建一个具有动态存储持续时间Rectangle对象。 每当您在指针上调用delete (或者,也许明确地调用析构函数)时,它将被销毁; 否则它不会被销毁。 人们非正式地说动态存储持续时间的对象是“堆中的”,但是这种实现的实现细节具有平台相关的含义。

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

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

有过分简化的风险。

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

这将创建读/写数据。

 Rectangle rect(15,12);

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

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

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

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

变量“获取存储”是在实现中定义的,除了其范围的特定语义外,不在C ++标准的范围内。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM