【问题标题】:Dynamically-Allocated Stack Memory with Class Scope具有类作用域的动态分配堆栈内存
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 嗯,这真的很有趣。我想我有一些基准测试要做。
猜你喜欢
  • 2019-05-17
  • 2020-09-15
  • 2010-12-11
  • 2011-12-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2018-07-24
  • 2011-09-14
相关资源
最近更新 更多