【发布时间】:2012-01-28 13:53:09
【问题描述】:
我正在寻找一种将堆栈分配包装在抽象数据类型中的方法。例如,我想要一个可以通过堆栈上的分配严格工作的向量。当然,我最大的障碍是 alloca 只能在当前堆栈框架内工作——因此我看不到将其包装到函数中的简单方法。
到目前为止,我看到的唯一方法是使用类似宏的函数,这些函数可以保证编译到给定的堆栈帧中。我不喜欢这种方法,因为它不像人们希望的那样友好,并且需要比预期更冗长的命名。
无论如何我可以在其调用堆栈上分配一个函数吗?我知道这通常会破坏立即调用的堆栈,因此很可能该函数也必须以某种方式强制内联。我不清楚我有哪些选择,所以我正在寻找一些想法,或指向可能的选择的指针。
注意事项:
最终目标类似于std::vector,它严格适用于直接函数堆栈。显然它只会作为const 对象传递给被调用者,并且它的生命以函数结束。
只要 C 方法比我的基于宏的方法好,C 方法就可以了。虽然一些支持宏也是可以接受的。
我知道这是一个相当具体的优化,最理想的情况是我希望能够(使用标志)打开/关闭它(仅使用普通的 std::vector 进行调试)。它会给我们代码的重要部分带来轻微的速度提升,但可能不足以证明通过太多奇怪的构造使其不可读。
答案:很可能是不可能的,只有宏观方法才有效。
【问题讨论】:
-
简而言之,你不能。
alloca不能很好地与 C++ 对象模型配合使用。如果您想更严格地控制内存分配,您始终可以将自己的分配器用于标准容器。 -
第一个链接是堆栈上的静态大小,我知道该怎么做,我希望有一个动态解决方案(我知道这可能是不可能的)。对于第二个问题,我不需要 STL 合规性,但这里的第一个答案可能相同(只是不可能)。
-
@DeadMG,为什么要去掉 C 标签?我表示我可以接受 C 方法——尤其是因为 C 解决方案比直接 C++ 解决方案更有可能。