【发布时间】:2012-07-28 17:03:06
【问题描述】:
一些编译器支持对 C++ 的扩展,因此可以在堆栈上动态分配内存。例如,g++ 支持 alloca() 以及 VLA。所有这些扩展都带有一个警告,即动态分配的内存在调用函数范围的末尾被“释放”。 (编辑:为了澄清,我在'deallocated'周围使用引号,因为实际发生的是编译器正在递减/递增堆栈指针,因此alloca()需要编译器支持。)这意味着使用alloca()分配的内存在一旦构造函数返回,类的构造函数就会被释放。
在构造函数通过一些重要步骤来确定要分配多少内存的类中,这个限制变得难以处理。类的用户必须在构造类的函数中分配内存,暴露一些可以说不应该暴露的内部结构。此外,在我的代码中添加变通方法以便能够使用 alloca() 或 VLA 通常很不方便。
你能想出一些方法来绕过这个限制,以便我可以使用alloca()、VLA 或其他语言扩展,从而可以在类内分配内存并具有类范围吗?
【问题讨论】:
-
是否有理由必须使用堆栈而不是堆来分配?
-
@void-pointer 从堆中获取一块内存并将其用作您自己的高效堆栈。
-
@void-pointer:您可能会对堆的速度感到惊讶。一些解决方法是(1)有一个静态函数来计算调用函数必须保留多少空间,以及(2)使用宏“构造函数”。但实际上,只需使用堆。
-
我真正想要这样做的原因是为了确定在我的应用程序中堆分配与 alloca() 的确切比较。
-
@void-pointer:在这种情况下,还要测试自定义堆栈分配器。
标签: c++ memory-management stack alloca variable-length-array