问题标签 [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 投票
12 回答
2039 浏览

c - 是否可以在 Linux 上预测 C 中的堆栈溢出?

在 x86 Linux 系统上,某些情况可能会导致堆栈溢出:

  • struct my_big_object[HUGE_NUMBER]在堆栈上。穿过它最终会导致SIGSEGV
  • alloca()例程(如malloc(),但使用堆栈,自动释放自身,SIGSEGV如果它太大也会爆炸)。更新: alloca() 并没有像我最初所说的那样被正式弃用;它只是气馁

有没有办法以编程方式检测本地堆栈对于给定对象是否足够大?我知道堆栈大小可以通过 调整ulimit,所以我希望有一种方法(但它可能是不可移植的)。理想情况下,我希望能够做这样的事情:

0 投票
11 回答
11465 浏览

c - Alloca 实施

如何在 D、C 和 C++ 等语言中使用内联 x86 汇编器实现 alloca()?我想创建一个稍微修改过的版本,但首先我需要知道标准版本是如何实现的。从编译器读取反汇编并没有帮助,因为它们执行了很多优化,我只想要规范形式。

编辑:我想困难的部分是我希望它具有正常的函数调用语法,即使用裸函数或其他东西,使其看起来像正常的 alloca()。

编辑#2:啊,到底是什么,你可以假设我们没有省略帧指针。

0 投票
8 回答
2118 浏览

c++ - 在 C++ 中调整动态堆栈分配的大小

我正在编写一个使用包围体层次结构来加速光线追踪的小型光线追踪器。长话短说,我有一棵二叉树,我可能需要访问多个叶子。

当前我有一个左右两个孩子的节点,然后在 travel() 期间,如果某些条件,在此示例 intersect() 中,访问孩子:

这种方法使用递归方法调用,但是,我需要尽可能优化这段代码......并且根据 IA-32 的优化参考手册,超过 16 的函数调用可能非常昂贵,所以我想这样做使用 while 循环而不是递归调用。但我不希望进行动态堆分配,因为这些很昂贵。所以我在想,也许我可以利用这样一个事实,即每次 while 循环从堆栈开始时都会处于相同的位置。在以下非常丑陋的黑客攻击中,我依靠 alloca() 始终分配相同的地址:

然而令人惊讶的是,这种方法似乎确实失败了:)但只要堆栈小于 4 或 5,它就可以工作......我也非常有信心这种方法是可能的,我只是真的认为我需要一些帮助来实现它正确。

那么如何从 C++ 手动操作堆栈,是否可以使用一些编译器扩展......或者我必须这样做是汇编程序,如果是这样,我如何编写汇编程序而不是可以用 GCC 和 ICC 编译.

我希望有人可以帮助我......我不需要一个完美的解决方案,只是一个黑客,如果它有效,它就足以达到这个目的:)

问候乔纳斯·芬尼曼·詹森

0 投票
24 回答
161517 浏览

c - 为什么使用 alloca() 不被认为是好的做法?

alloca()在堆栈上而不是在堆上分配内存,如malloc(). 因此,当我从例程返回时,内存被释放。所以,实际上这解决了我释放动态分配内存的问题。释放通过分配的内存malloc()是一个令人头疼的问题,如果以某种方式错过会导致各种内存问题。

alloca()尽管有上述功能,为什么不鼓励使用?

0 投票
1 回答
280 浏览

c++ - alloca() 的模板类型数组:如何做到这一点?

我有一个智能指针类型,并且想构造一个对象,该对象接受该类型的指针和计数(在运行时动态计算)并从堆栈中分配足够的内存来保存智能指针指向的对象的许多实例. 我似乎找不到完全正确的语法来实现这一点;是否可以?

鉴于这样的事情

我想做这样的事情:

调用以下宏的代码无法编译,因为编译器无法从 _wrappedPtr 推导出 SomeObject 的模板参数,因此抱怨缺少模板参数:

如果使用在指针包装类型上模板化的函数,尽管编译器可以隐式推断类型,但调用它的代码不会编译,因为 SomeObject 故意定义但没有实现复制构造函数或赋值运算符;即使它确实编译了它也不会做正确的事情,因为 alloca() 提供的内存会立即超出范围:

我想避免将类型作为参数传递给宏,因为在实际代码中,这会导致在使用时出现相当冗长、难以阅读的语句,但我想如果没有更好的办法,这是一个后备方案可能的。

0 投票
2 回答
1060 浏览

llvm - llvm 代码中出现的 %"alloca point" 行的目的是什么?

我最近一直在看一些由 llvm-gcc 生成的 LLVM 程序集,我注意到一个反复出现的声明,我不确定它的用途。

例如,下面的 C 程序:

当使用“llvm-gcc -emit-llvm -S”编译时,将产生以下代码(不相关部分已删除):

我对该行的目的感兴趣:

似乎没有做任何事情,因为它分配给的变量永远不会再次使用,并且 bitcast 本身毫无意义。我能想到的是,它实际上是作为 nop 插入的,用于以后的代码生成/分析目的,表明代码的有趣部分。

0 投票
1 回答
565 浏览

objective-c - alloca 和 ObjectiveC 垃圾收集器

在启用 GC 的目标 C 项目中,我在堆栈上分配一个可变大小的数组,如下所示:

(我想这样做的原因并不重要:)然后,在一个循环中,我在 myStack 上/从 myStack 上推送和弹出内容。我压入堆栈的一些东西是没有从其他任何地方引用的新对象。

我的直觉告诉我,目标 C 垃圾收集器不知道这些指针,因此会收集新的(否则未引用的)对象。这种信念的一部分来自这样一种想法,即目标 C GC 并不是真正保守的,而是“知道它的指针”(例如,通过堆栈映射)。

然而,在我所有的实验中(插入 [[NSGarbageCollector defaultCollector] collectExhaustively] 调用)我没有收集到这些对象——这很好,但出乎意料。所以看起来,GC 正在扫描整个堆栈,例如,保守地假设一个恰好具有有效指针值的整数实际上是一个指针。

那是对的吗?还是我错过了什么?

0 投票
2 回答
5019 浏览

c++ - alloca 是 C++ 标准的一部分吗?

alloca 是 C++ 标准的一部分吗?

0 投票
4 回答
2779 浏览

visual-c++ - 如何在没有 _alloca 的情况下进行 GCC 编译?

出于某种原因,我应该使用 gcc 编译 C 文件,然后链接到 Visual C++ 2008 项目。

(我使用了当前最新的 gcc 版本:cygwin gcc 4.3.4 20090804。)

但是有一个问题:gcc总是用_alloca分配一个大数组,

并且 VC 链接器无法解析符号 __alloca。

例如,

尽管我没有显式调用 _alloca 函数,但这段代码产生了 _alloca 依赖项。

(数组大小很重要。如果我更改 10240 -> 128,一切正常)

我尝试了 gcc 选项 -fno-builtin-alloca 或 -fno-builtin,但没有运气。

是否可以让 gcc 不使用 _alloca ?(或调整阈值?)

0 投票
6 回答
1874 浏览

c - alloca(n) 和 char x[n] 有什么区别?

和有什么区别

...其中size是一个变量,其值在编译时未知。