0

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

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

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

4

1 回答 1

5

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

但是,您可以使用适当的自定义分配器来实现极快的堆分配,例如内存竞技场 - 到它足够快的程度。您需要记住的是,这new是内存分配的核弹头——它必须支持任何分配大小和任何分配/解除分配模式。更具体的东西可以运行得更快,甚至可以与堆栈分配的内存竞争。在 Visual Studio 2010 上,我什至可以让它alloca.

于 2012-07-31T00:24:37.190 回答