具有类范围的动态分配堆栈存储器

时间:2012-07-31 00:20:17

标签: c++ memory-management stack alloca variable-length-array

多个编译器支持C ++扩展,从而可以在堆栈上动态分配内存。例如,g++支持alloca()以及VLA。所有这些扩展都伴随着警告,即动态分配的内存在调用函数范围的末尾被“释放”。 (编辑:为了澄清,我使用'deallocated'周围的引号,因为实际发生的是编译器正在递减/递增堆栈指针,因此alloca()需要编译器支持。)这意味着使用{{1分配的内存一旦构造函数返回,就会释放一个类的构造函数。

这种限制变得难以在构造函数经历一些重要步骤来确定要分配多少内存的类中处理。该类的用户必须在构造类的函数中分配内存,暴露一些可能不应该暴露的内部。此外,在我的代码中使用变通方法以便能够使用alloca()或VLA通常不方便。

你能想出一些规避这种限制的方法,以便我可以使用alloca(),VLA或其他语言扩展,以便可以在类中分配内存并具有类范围吗?

1 个答案:

答案 0 :(得分:5)

不,这是不可能的。一个类不能分配函数本地内存 - 普通没有意义。

但是,你可以使用适当的自定义分配器实现极快的堆分配,就像内存竞技场一样 - 它足够快。您需要记住的是new是内存分配的核弹头 - 它必须支持任何分配大小,以及任何分配/解除分配模式。更具体的东西可以更快地运行到一定程度 - 它与堆栈分配的内存相当具有竞争力。在Visual Studio 2010上,我甚至可以让它比alloca更快地执行