问题标签 [alloca]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
1289 浏览

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

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

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

无论如何我可以获得一个函数来分配它的调用者堆栈吗?我知道这通常会破坏立即调用的堆栈,因此很可能该函数也必须以某种方式强制内联。我不清楚我有什么选择,所以我正在寻找一些想法,或者指向可能的选择的指针。


笔记:

最终目标是类似于 a 的东西,std::vector它严格适用于直接函数堆栈。显然它只会作为const对象传递给被调用者,并且它的生命以函数结束。

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

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

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

0 投票
3 回答
9753 浏览

c - C中的alloca函数

我正在修改 C 并遇到了 alloca/free 函数,它被描述为在像空间一样的堆栈上分配存储。这和 malloc/free 一样吗?或者这是不同的东西?谢谢。

0 投票
4 回答
213 浏览

c++ - 可变大小类的分配

我有一个可变长度的数据结构,一个多维迭代器:

迭代器的维度在编译时是未知的,但可能很小,所以我为迭代器分配内存alloca

有没有更优雅的方式为迭代器分配内存?我知道从函数返回时,它的堆栈被展开,因此alloca必须在调用者的堆栈框架中使用(参见例如here)。这个答案建议在默认参数中执行分配:

不管多么优雅,这个解决方案对我没有帮助:Default argument references parameter 'dim'. 有什么好的解决方案建议吗?

0 投票
1 回答
279 浏览

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

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

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

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

0 投票
2 回答
162 浏览

c - alloca的应用是什么?

可能重复:
在哪些情况下 alloca() 有用?

最近碰巧看到了alloca()函数的使用。谷歌搜索告诉我它用于在堆栈上分配空间。我无法为它获取应用程序?另外,使用这个有什么陷阱吗?

0 投票
2 回答
391 浏览

c++ - c ++从堆栈中释放“_alloca” ted内存

我知道 _alloca 的行为是在您离开函数时从堆栈中释放内存。有没有办法提前释放内存?

0 投票
1 回答
736 浏览

c++ - 架构 x86_64 的未定义符号:“_alloca”

我正在尝试制作项目polyworld但编译 qt_clust.o 时出错

并得到

我很确定问题出在这个文件上:https ://github.com/JaimieMurdock/polyworld/blob/master/tools/clustering/qt_clust.cpp

我在 OSX Mountain Lion 上。

0 投票
3 回答
625 浏览

c++ - 这是使用 alloca 的好理由吗?

我有以下功能:

xx它使用n存储在x和中的点执行拉格朗日插值ywork数组有2 * n大小。由于这是多项式插值,n因此大约在 5 左右,很少超过 10。

此函数经过积极优化,应该在紧密循环中调用。分析表明在循环中分配工作数组的堆是不好的。不幸的是,我应该把它打包成一个类似函数的类,而客户一定不知道工作数组。

现在,我使用模板整数参数作为度数并std::array避免work数组的动态分配:

可以将工作数组存储为类的可变成员,但operator()应该由多个线程同时使用。n如果您在编译时知道此版本是可以的。

现在,我需要n在运行时指定参数。我想知道这样的事情:

使用时会响起一些铃声alloca:我当然会设置上限n以避免alloca调用溢出(无论如何使用 100 次多项式插值非常愚蠢)。

但是,我对这种方法很不满意:

  • 我错过了一些明显的危险alloca吗?
  • 有没有更好的方法来避免这里的堆分配?
0 投票
4 回答
146 浏览

c - 是否可以在 C 中编写类似 _alloca 的函数?

函数_alloca(alloca)在栈上分配内存,不需要“free”。

是否可以在 C 中编写一个在堆栈上分配的函数?

另一种表达方式:_alloca 做到了!

或者这在 C 中是不可能的,因为其他原因包括:1)功能是用 ASM 编写的 2)它是 C 运行时库的一个特性。

我对编写类似 alloca 的函数感兴趣的原因如下:

但我更喜欢:

在此先感谢任何了解该主题的人。asnprintf 是对使用固定大小缓冲区的改进,但仍需要清理。

0 投票
1 回答
1740 浏览

llvm - LLVM 中 alloca/memset 的预期用途

使用 分配堆栈空间时alloca(),是否需要清除内存或保证只包含零?

我想出了以下 LLVM 代码。尽管它可以编译,但它会导致核心转储。

在代码中,我试图实现对象的实例化,然后将其分配给“成员变量”。