如何决定堆栈上的内容
How to decide what goes on stack?
假设我有一个名为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
或其他低于MainComponent
的结构,那么你总是可以堆分配该结构/数组/类,同时仍然将 MainComponent 本身保留在堆栈上。
从概念上讲,将MainComponent
保留在堆栈上更有意义,因为它的生命周期是由其在main
函数中的范围精确建模的。
要回答您更一般的问题,如何决定堆栈上的内容?,请考虑三个方面:
- 所有权。特定数据结构的所有权是否明确?它是否明确属于特定函数(及其后代)或特定结构/类,并且可以使用 RAII 建模?
- 生命周期。特定数据结构是否应存在于与创建它的类的生存期或创建它的函数非常相似的时间线中?范围是什么?
- 编译时大小是否已知? 这在分配可变大小的数组时出现。许多 STL 容器就是这种情况。在这种情况下,基本结构/类在堆栈上包含一些内容,然后维护指向堆分配结构的指针。
你说:
预计 MainComponent 类可能会变得非常大,因为 包含的游戏类对象
例如:空std::string
与非常长的std::string
具有相同的sizeof
,对于任何对象都是相同的。
sizeof(object)
是它在堆栈上占用的唯一字节。 无论如何,其余的都进入了堆。
因此,如果您达到堆栈限制并出现堆栈溢出异常,那么您应该尝试将一些对象移动到堆中。 或者,如果它是一个对象(就像您的MainComponent
类一样),您也可以使用 singleton
模式,或者只是将其声明为 static
,将其从堆栈中删除到其他内存段。
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- Python中的for循环与C++有何不同
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 无堆栈协程与堆叠协程有何不同
- 如何决定堆栈上的内容
- 什么是堆栈?arrayStack ?arrayQueue ?堆栈队列 ?它们在C++上有何不同
- C++标准对堆栈溢出有何规定
- 在这种情况下,如何决定堆栈、堆和boost::池的分配