如何判断堆栈上的内容?

时间:2015-01-07 23:13:25

标签: c++ pointers dynamic stack heap

假设我有一个名为MainComponent的C ++类,它里面有几个类:WindowClass,InputClass,GameClass。主要功能设置如下:

int main()
{
    MainComponent app;
    app.start(); // Initializes the MainComponent class, opens window, starts game and all that.

    return 0;
}

由于GameClass等包含的对象,预计MainComponent类可能会变得非常大。应该使用new动态分配MainComponent应用程序吗?或者我应该在MainComponent类中使用new分配GameClass对象?或者只要运行正常或什么,将它留在堆栈上就可以了?

2 个答案:

答案 0 :(得分:2)

取决于'大'意味着什么。 This link显示某些操作系统的默认堆栈大小限制。您需要确保堆栈上的MainComponent分配大小远低于这些数字。

此外,如果某些事物是动态创建的,或某些数组/资产太大,属于MainComponent或另一个低于MainComponent的结构,那么您可以随时堆积 - 分配该struct / array / class,同时仍然将MainComponent本身保留在堆栈上。

从概念上讲,将MainComponent保留在堆栈上更有意义,因为它的生命周期完全由main函数中的范围建模。

要回答更一般的问题,如何确定堆栈上的内容?,请考虑以下三个方面:

  1. 所有权即可。特定数据结构的所有权是否清晰?它是否明确属于特定函数(及其后代),或特定结构/类,并且可以使用RAII建模?
  2. 生命周期即可。特定数据结构是否应该存在于与创建它的类的生命周期非常相似的时间轴中,或者是创建它的函数?范围是什么?
  3. 在编译时是否知道大小?在分配可变大小的数组时会出现这种情况。许多STL容器就是这种情况。在这种情况下,基本结构/类包含堆栈上的一些内容,然后维护指向堆分配结构的指针。

答案 1 :(得分:0)

你说:

  

由于MainComponent类可能会变得非常大   包含GameClass的对象

对象大小是不变的。例如:空std::stringsizeof具有相同的std::string,对于任何对象都是相同的。

sizeof(object)是它在堆栈上占用的唯一字节。所有其余的都无论如何都会进入堆。

因此,如果达到堆栈限制并获得堆栈溢出异常,那么您应该尝试将一些对象移动到堆中。或者如果它是单个对象(如MainComponent类似乎),您也可以使用singleton模式,或者只是将其声明为static,以将其从堆栈中删除到其他记忆段。