当声明不同的方式以及哪种方式最好时,似乎不清楚全局变量的存储位置?
例如,每个示例中存储的变量在哪里?它们的范围是什么?
//Example 1 (at the top of a cpp file):
Rectangle rect(15,12);
//Example 2:
Rectangle *rect = new Rectangle(15,12);
答案 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
指针,和/或重新分配它以指向此类的其他实例