全局变量C 的分配

Allocation of global variables C++

本文关键字:分配 全局变量      更新时间:2023-10-16

在声明不同的方式以及哪种方式最好的方式时似乎不清楚在哪里存储?

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

//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时,它都会被破坏(或者可能明确调用destructor);否则将不会被销毁。非正式的人说,动态存储持续时间的对象"在堆上",但是该唤起的实现细节具有依赖平台的含义。

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

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

有过度简化的风险。。。。

编译器将把编译单元分为部分: - 可执行数据 - 仅阅读数据 - 阅读写数据链接器将将所有属性的部分一起收集在一起。在链接过程的末尾,全局读/写数据通常与读/写数据合并。

这创建读/写数据。

 Rectangle rect(15,12);

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

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

忽略调试信息,本地变量仅在编译过程中具有范围。汇编后,局部变量仅是[相对]存储位置。汇编后,全局变量仍然可识别。链接后,全局变量基本上消失了。

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

其中定义了变量"被存储",并且不在C 标准的范围中,除了其范围的特定语义。

假设两种声明都是静态分析的,在这两种情况下," rect"都将存储在静态范围上。在第二种情况下,RECT将参考堆分配的对象,在整个应用程序的寿命中,应用程序可以delete指针和/或重新分配给该类别的其他实例。