3

我是 C++ 新手,对全局变量有一个问题。我在许多示例中看​​到全局变量是带有堆地址的指针。所以指针在全局/静态变量的内存中,地址后面的数据在堆上,对吧?
取而代之的是,您可以声明存储数据的全局(无指针)变量。因此,数据存储在全局/静态变量的内存中,而不是堆上。
这个解决方案比第一个带有指针和堆的解决方案有什么缺点吗?

编辑:
第一个解决方案:

//global 
Sport *sport;
//somewhere
sport = new Sport;

第二种解决方案:

//global
Sport sport;
4

3 回答 3

2

将数据存储在全局/静态变量中的一个缺点是,大小在编译时是固定的,不能更改,而堆存储的大小可以在运行时确定,并在运行过程中反复增长或缩小。对于全局/静态变量,生命周期也固定为程序从开始到结束的完整运行,而不是在程序运行时可以获取和释放(甚至重复)的堆存储。另一方面,全局和静态存储管理都由编译器为您处理,而堆存储必须由您的代码显式管理。所以总而言之,全局/静态存储更容易,但不如堆存储灵活。

于 2013-08-25T13:33:58.217 回答
1

您对物体所在位置的假设是正确的。关于使用,
它是课程的马匹。没有明确的规则,这取决于您要实现的设计和功能类型。例如:
可以选择指针版本来实现延迟初始化或多态行为,这两者都不能用全局非指针对象方法。

于 2013-08-25T13:29:43.257 回答
1

正确的。声明的变量进入 DataSegment。他们在程序的整个生命周期中都坐在那里。你不能释放它们。您不能重新分配它们。在 Windows 中,DataSegment 是固定大小的......如果你把所有东西都放在那里,你可能会耗尽内存(至少以前是这样的)。

于 2013-08-25T13:30:46.817 回答