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

c - C alloca 函数 - 当试图分配太多内存时会发生什么

在 C 中,alloca() 函数在 alloca() 调用者的堆栈帧上分配内存。

当您尝试分配大量无法分配的字节时会发生什么?

  • 在堆栈遇到堆段之前,它是否会分配尽可能多的字节?
  • 或者它根本没有分配任何东西?

    分配(100000000000000000000);

手册中提到:

alloca() 函数返回一个指向已分配空间开头的指针。如果分配导致堆栈溢出,则程序行为未定义。

我知道这种行为是未定义的。但必须说的远不止这些:

  • 它返回什么,在调用 main 之前指向堆栈顶部之后的第一个字节的指针?
  • alloca() 返回后的堆栈指针与调用 alloca() 之前的堆栈指针不同吗?

有没有人有更多关于这个的信息?

0 投票
3 回答
228 浏览

c - alloca 函数范围内的 goto 是否有效?

C 标准禁止 goto 进入存在 VLA 的函数范围。

VLA 和对 alloca 函数的调用在低级别应该具有相同的结果。

(我可能是错的,因为我只是一个 C,不是低级程序员,但在我的想象中这似乎很机智)

那么下面的代码片段也会是未定义的行为吗?

当然我不能参考p,但是行为呢?

0 投票
2 回答
283 浏览

c - 在 C 中包装 alloca 函数

是否可以将 C 函数包装alloca成“另一个”?(当然只有宏)

就像是:

我不太确定这一点,扩展是否会6.1 Statements and Declarations in Expressions创建一个新的堆栈框架?(因为大括号,它看起来有点像)

编辑:

它对其进行了一些测试:

输出:

alloca() 函数在调用者的栈帧中分配 size 个字节的空间

那么,上述方法安全吗?

0 投票
2 回答
717 浏览

c++ - 使用 alloca() 是否有效?

在使用标准向量保存我的国际象棋引擎的移动列表后,我意识到因为国际象棋的平均因子为 35(即从典型位置开始的 35 次合法移动),向量的大小调整了很多,从而对移动发生器的性能。解决这个问题的一种方法(我今天才意识到)是为向量保留最小容量。然而,使用 alloca() 的可能性引起了我的注意。这可能是一个非常简单的问题,但是关于 alloca() 的文档非常稀缺,很少有关于如何使用它的示例。

因此,来自可变大小类分配的答案提到堆栈分配无法调整大小。然而,以下内容是否有效?

具体来说,如果说,第一次 alloca() 的容量不足 10,那么简单地再次调用 alloca() 以分配更多内存在语法上是否有效(并且正确)?这种方法会提供更好的性能(与使用 reserve() 的 std 向量相比),还是只会增加堆栈溢出的机会?我的 Move 结构需要大约 28 字节的内存,我怀疑引擎会递归搜索(使用 alpha-beta)到最多 7 或 8 层,因此可能会从堆栈中使用一些 28 * 35 * 8 ~ 8kb max . 我在某处读到,通常堆栈的限制为 1Mb,所以这应该不会太多吧?

编辑:感谢下面的答案,我现在意识到我最初对 alloca() 所做的理解是错误的。但是,我仍然想知道是否可以通过以下方式使用 alloca():

0 投票
1 回答
357 浏览

memory-management - How to get the address literally allocated by allocaInstr in llvm?

I am trying to do some instrumentation over an ll file. One of the task I want to achieve is the following.

Whenever I meet an AllocaInstr like:

I want to instrument a function call __save_addr() after it as follows:

Is there a way to achieve this?

0 投票
1 回答
424 浏览

c - 当 _malloca 无法在堆上分配内存时

当 alloca 无法在堆上分配内存时,它会创建结构化异常 stackoverflow 并使用 Stackoverflow 停止程序。好的。但是当 _malloca 不能在堆上分配内存时,它什么也没说。我分配了大量内存,然后使用它,但得到访问冲突异常。例子

但是当我只使用部分分配的内存时,我根本没有例外。例子

VSE2013 桌面版。Oki,你可能会说,试着捕捉异常

但它继续工作。如果使用数组的所有元素,则再次获得访问冲突。
问题:这是错误还是功能?

0 投票
6 回答
312 浏览

c - 在堆栈上增长数组

这本质上是我的问题。在函数的生命周期中,我生成一些整数,然后在算法中使用整数数组,该算法也是同一函数的一部分。整数数组只会在函数内使用,因此将数组存储在堆栈上自然是有意义的。

问题是在我完成生成所有整数之前我不知道数组的大小。

我知道如何在堆栈上分配固定大小和可变大小的数组。但是,我不知道如何在堆栈上增长数组,这似乎是解决我的问题的最佳方法。我相当确定这可以在汇编中完成,您只需递增堆栈指针并为每个生成的 int 存储一个 int,因此 int 数组将位于堆栈帧的末尾。这可能在C中做到吗?

0 投票
4 回答
1907 浏览

c - 函数内部 malloc 的 C 用法

我有以下功能:

我正在为临时指针分配内存*temp

但我不会在任何地方释放它。

据我所知,释放该内存有 4 个选项:

  1. 在同一范围内使用free()(这对我来说是不可能的,因为我必须返回指针)
  2. alloca()每个编译器都不支持使用(不是 ANSI C)
  3. malloc()函数外部的指针并将该指针传递给函数,然后将free()其传递给函数外部
  4. 将返回的指针分配给一个变量并释放该变量

这是选项 #4 的代码:

当我为它分配一个返回的指针时,我是否必须给malloc()该变量var,因为该指针已经被malloc()编辑了?

我的问题是:

在函数内部使用的最佳方法是malloc()什么?

malloc()如果我选择第 4 个选项,在将返回的指针分配给变量之前,我是否必须对其进行赋值?

0 投票
1 回答
133 浏览

c - 复合语句中的 alloca

是否可以在复合语句中使用 alloca ?例子:

根据我的经验,它运作良好,但我不确定它是否安全。顺便说一句,它用 gcc 4.8.4 编译

0 投票
3 回答
63118 浏览

c - alloc、malloc 和 alloca — 有什么区别?

我的印象是alloc在 Objective-C 中(当我们调用[anyObject alloc]实际上是实现 C 函数malloc并且内存在堆中分配时,但在任何地方都找不到答案。

另外,在搜索时alloc,我发现allocawhich 在堆栈中分配内存。如果我没记错的话,alloc在堆中分配内存来创建对象。

alloc那么,和malloc(和)有什么区别alloca?谁能总结一下?