假设我有一个名为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对象?或者只要运行正常或什么,将它留在堆栈上就可以了?
答案 0 :(得分:2)
取决于'大'意味着什么。 This link显示某些操作系统的默认堆栈大小限制。您需要确保堆栈上的MainComponent
分配大小远低于这些数字。
此外,如果某些事物是动态创建的,或某些数组/资产太大,属于MainComponent
或另一个低于MainComponent
的结构,那么您可以随时堆积 - 分配该struct / array / class,同时仍然将MainComponent本身保留在堆栈上。
从概念上讲,将MainComponent
保留在堆栈上更有意义,因为它的生命周期完全由main
函数中的范围建模。
要回答更一般的问题,如何确定堆栈上的内容?,请考虑以下三个方面:
答案 1 :(得分:0)
你说:
由于MainComponent类可能会变得非常大 包含GameClass的对象
对象大小是不变的。例如:空std::string
与sizeof
具有相同的std::string
,对于任何对象都是相同的。
sizeof(object)
是它在堆栈上占用的唯一字节。所有其余的都无论如何都会进入堆。
因此,如果达到堆栈限制并获得堆栈溢出异常,那么您应该尝试将一些对象移动到堆中。或者如果它是单个对象(如MainComponent
类似乎),您也可以使用singleton
模式,或者只是将其声明为static
,以将其从堆栈中删除到其他记忆段。