voi*_*ter 0 c++ stack memory-management alloca variable-length-array
一些编译器支持C++扩展,从而可以在堆栈上动态分配内存.例如,g++支持alloca()以及VLA.所有这些扩展都伴随着警告,即动态分配的内存在调用函数范围的末尾被"释放".(编辑:为了澄清,我使用'deallocated'周围的引号,因为实际发生的是编译器递减/递增堆栈指针,因此为什么alloca()需要编译器支持.)这意味着alloca()在类的构造函数中使用分配的内存被释放一旦构造函数返回.
在构造函数经历一些非常重要的步骤来确定要分配多少内存的类中,这种限制变得难以处理.该类的用户必须在构造类的函数中分配内存,暴露一些可能不应该暴露的内部.此外,将解决方法放在我的代码中以便能够使用alloca()或使用VLA通常是不方便的.
你能想出一些方法来绕过这个限制,以便我可以使用alloca(),VLA或其他语言扩展,以便内存可以在类中分配并具有类范围吗?
不,这是不可能的.一个类不能分配函数本地内存 - 普通没有意义.
但是,您可以通过适当的自定义分配器(如内存竞技场)实现极快的堆分配,以达到足够快的速度.您需要记住的是new内存分配的核弹头 - 它必须支持任何分配大小和任何分配/解除分配模式.更具体的东西可以更快地运行到一定程度 - 它与堆栈分配的内存相当具有竞争力.在Visual Studio 2010中,我甚至可以得到它的执行速度比alloca.