具有类作用域的动态分配堆栈内存



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

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

你能想出一些方法来绕过这个限制吗?这样我就可以使用alloca()、VLA或其他语言扩展,这样内存就可以在类中分配并具有类范围了?

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

然而,可以使用适当的自定义分配器(如内存竞技场)实现极快的堆分配,达到足够快的程度。你需要记住的是,new是内存分配的核弹头——它必须支持任何分配大小,以及任何分配/解除分配模式。一些更具体的东西可以运行得更快,以至于它与堆栈分配的内存相当有竞争力。在VisualStudio2010上,我甚至可以让它比alloca更快地执行

相关内容

  • 没有找到相关文章