问题标签 [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.
c++ - 函数包装器中的堆栈分配/函数中的 alloca
我正在寻找一种将堆栈分配包装在抽象数据类型中的方法。例如,我想要一个可以通过堆栈上的分配严格工作的向量。当然,我最大的障碍是它alloca
只能在当前堆栈框架内工作——因此我看不到将它包装到函数中的简单方法。
到目前为止,我看到的唯一方法是使用类似宏的函数,这些函数可以保证编译到给定的堆栈帧中。我不喜欢这种方法,因为它不像人们希望的那样友好,并且需要比预期更冗长的命名。
无论如何我可以获得一个函数来分配它的调用者堆栈吗?我知道这通常会破坏立即调用的堆栈,因此很可能该函数也必须以某种方式强制内联。我不清楚我有什么选择,所以我正在寻找一些想法,或者指向可能的选择的指针。
笔记:
最终目标是类似于 a 的东西,std::vector
它严格适用于直接函数堆栈。显然它只会作为const
对象传递给被调用者,并且它的生命以函数结束。
只要 C 方法比我的基于宏的方法更好,它就可以了。虽然一些支持宏也是可以接受的。
我知道这是一个相当具体的优化,最好我希望能够(使用标志)打开/关闭它(仅使用普通的 std::vector 进行调试)。它会给我们代码的重要部分带来轻微的速度提升,但可能不足以证明通过太多奇怪的构造使其不可读。
答案:很可能这是不可能的,只有宏观方法才有效。
c - C中的alloca函数
我正在修改 C 并遇到了 alloca/free 函数,它被描述为在像空间一样的堆栈上分配存储。这和 malloc/free 一样吗?或者这是不同的东西?谢谢。
c++ - 具有类作用域的动态分配堆栈内存
一些编译器支持对 C++ 的扩展,因此可以在堆栈上动态分配内存。例如,g++
支持alloca()
以及 VLA。所有这些扩展都带有一个警告,即动态分配的内存在调用函数范围的末尾被“释放”。(编辑:为了澄清,我在'deallocated'周围使用引号,因为实际发生的是编译器正在递减/递增堆栈指针,因此为什么alloca()
需要编译器支持。)这意味着alloca()
在类的构造函数中分配的内存被释放一旦构造函数返回。
在构造函数通过一些重要步骤来确定要分配多少内存的类中,这种限制变得难以处理。类的用户必须在构造类的函数中分配内存,暴露一些可以说不应该暴露的内部结构。此外,在我的代码中加入变通办法以便能够使用alloca()
或 VLA 通常不方便。
你能想出一些方法来规避这个限制,以便我可以使用alloca()
VLA 或其他语言扩展,从而可以在类内分配内存并具有类范围吗?
c - alloca的应用是什么?
可能重复:
在哪些情况下 alloca() 有用?
最近碰巧看到了alloca()函数的使用。谷歌搜索告诉我它用于在堆栈上分配空间。我无法为它获取应用程序?另外,使用这个有什么陷阱吗?
c++ - c ++从堆栈中释放“_alloca” ted内存
我知道 _alloca 的行为是在您离开函数时从堆栈中释放内存。有没有办法提前释放内存?
c++ - 架构 x86_64 的未定义符号:“_alloca”
我正在尝试制作项目polyworld但编译 qt_clust.o 时出错
并得到
我很确定问题出在这个文件上:https ://github.com/JaimieMurdock/polyworld/blob/master/tools/clustering/qt_clust.cpp
我在 OSX Mountain Lion 上。
c++ - 这是使用 alloca 的好理由吗?
我有以下功能:
xx
它使用n
存储在x
和中的点执行拉格朗日插值y
。work
数组有2 * n
大小。由于这是多项式插值,n
因此大约在 5 左右,很少超过 10。
此函数经过积极优化,应该在紧密循环中调用。分析表明在循环中分配工作数组的堆是不好的。不幸的是,我应该把它打包成一个类似函数的类,而客户一定不知道工作数组。
现在,我使用模板整数参数作为度数并std::array
避免work
数组的动态分配:
可以将工作数组存储为类的可变成员,但operator()
应该由多个线程同时使用。n
如果您在编译时知道此版本是可以的。
现在,我需要n
在运行时指定参数。我想知道这样的事情:
使用时会响起一些铃声alloca
:我当然会设置上限n
以避免alloca
调用溢出(无论如何使用 100 次多项式插值非常愚蠢)。
但是,我对这种方法很不满意:
- 我错过了一些明显的危险
alloca
吗? - 有没有更好的方法来避免这里的堆分配?
c - 是否可以在 C 中编写类似 _alloca 的函数?
函数_alloca(alloca)在栈上分配内存,不需要“free”。
是否可以在 C 中编写一个在堆栈上分配的函数?
另一种表达方式:_alloca 做到了!
或者这在 C 中是不可能的,因为其他原因包括:1)功能是用 ASM 编写的 2)它是 C 运行时库的一个特性。
我对编写类似 alloca 的函数感兴趣的原因如下:
但我更喜欢:
在此先感谢任何了解该主题的人。asnprintf 是对使用固定大小缓冲区的改进,但仍需要清理。
llvm - LLVM 中 alloca/memset 的预期用途
使用 分配堆栈空间时alloca()
,是否需要清除内存或保证只包含零?
我想出了以下 LLVM 代码。尽管它可以编译,但它会导致核心转储。
在代码中,我试图实现对象的实例化,然后将其分配给“成员变量”。