c++ - 函数包装器中的堆栈分配/函数中的分配

标签 c++ gcc alloca

我正在寻找一种将堆栈分配包装在抽象数据类型中的方法。例如,我想要一个可以通过堆栈上的分配严格工作的 vector 。我最大的障碍当然是 alloca 仅在当前堆栈框架内工作——因此我看不到将其包装到函数中的简单方法。

到目前为止,我看到的唯一方法是使用类似宏的函数,这些函数保证被编译到给定的堆栈帧中。我不喜欢这种方法,因为它不像人们希望的那样类型友好,并且需要比预期更冗长的命名。

有没有办法让我在调用者栈上分配一个函数?我知道这通常会破坏立即调用堆栈,因此可能还必须以某种方式强制内联该函数。我不清楚我有哪些选择,所以我正在寻找一些想法,或寻找可能的选择。


注释:

最终目标是类似于 std::vector 的东西,它严格地在即时函数堆栈上工作。显然,它只会作为 const 对象传递给被调用者,并且它的生命随着函数的结束而结束。

C 方法很好,只要它比我基于宏的方法更好。虽然一些支持宏也是可以接受的。

我知道这是一个相当具体的优化,最佳情况下我希望能够(使用标志)打开/关闭它(仅使用普通的 std::vector 进行调试)。这会给我们代码的重要部分带来轻微的速度提升,但可能不足以证明通过太多奇怪的构造使其不可读。

回答:很可能这是不可能的,只有宏观方法才有效。

最佳答案

你不能。
当一个函数返回时,它的堆栈被展开,堆栈指针回到它之前的位置。它必须,如果你不想要一个真正的困惑。 alloca 所做的只是移动堆栈指针,因此函数返回会撤消此分配。
宏会起作用,因为它们只是将代码添加到同一个函数中。但它会很难看,没有真正改进的希望。

关于c++ - 函数包装器中的堆栈分配/函数中的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8645957/

相关文章:

c - 为什么不能在函数参数列表中使用 alloca?

c++ - 我们可以在 c++20 协程中使用 alloca() 或可变长度数组扩展吗?

gcc - LD:链接描述文件中的对齐与子对齐

c++ - 用于 linux 的 c 程序,用于获取设备的序列号,用于非 root 用户

C++ NOT位运算符二进制char转换

c++ - 有没有办法在不调用元素构造函数的情况下为 std::vector 分配内存?

c++ - 尝试在 fedora 25 上链接 SFML 应用程序

c++ - 将共享库链接到另一个共享库

C++ 在将文本文件读入字符串时如何忽略文本文件中的符号/数字?