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

c++ - 运行时检查失败 #4 - 此函数保留的 _alloca 内存周围的堆栈区域已损坏?

当我运行此代码时,每次调用都会出现此错误:

在此处输入图像描述 我正在使用 Visual C++ 2019,stdc++14 和 stdc++17 都会产生相同的错误。

这段代码有什么问题?

0 投票
1 回答
67 浏览

linux - 从另一个函数调用参数调用 alloca()?

为什么alloc( )像这样调用另一个函数调用的参数func(x, alloca(size), z);被认为是错误的根据一本书叫the linux programming interface

这是因为由 alloca() 分配的堆栈空间将出现在函数参数空间的中间(放置在堆栈框架内的固定位置)。相反,我们必须使用如下代码:

虽然这是错误的

不是这两个部分应该是等价的吗?在第一个allocafunc调用时,它的返回值被调用,所以如果有人可以解释如何alloca在堆栈上分配内存,这使得两种方法都不同。

0 投票
2 回答
133 浏览

c++ - alloca的性能

这些天我使用alloca了很多来分配临时缓冲区。在我的应用程序(信号处理)中,这是一个常见的需求。

问题是:

分配多个数组时,只使用一次 alloca 会更好(性能方面)吗?

像这样:

或者像这样多次使用它:

我的意思是它可能所做的只是减少堆栈指针并可能执行“堆栈探测”,这取决于大小,所以可能没关系?

0 投票
1 回答
82 浏览

c - 禁用优化的 c alloca 函数的奇怪汇编代码 - gcc 使用 DIV 和 IMUL 为常数 16,并转换?

我在c中有这个简单的代码

我希望为 alloca 函数生成的汇编代码只会递减堆栈指针(一个子指令),并且可能会进行一些对齐(一个和指令),但是生成的汇编代码非常复杂,甚至比您预期的效率低。

这是objdump -d main.o, 的输出gcc -c(没有优化,所以默认-O0

知道这个生成的汇编代码的目的是什么吗?我正在使用 gcc 8.3.1。

0 投票
3 回答
152 浏览

c++ - 为什么 alloca 两次返回相同的地址?

我正在尝试实现自己的数学库,并且从向量开始。这个想法是给类一个指向数字数组的指针,然后复制数组并将其存储在私有变量指针给出的数据地址中。首先,我曾经alloca尝试为私有变量释放一些内存

vml.h

主文件

这不会产生任何错误,但是由于某种原因,alloca在调用两个实例时会两次返回相同的地址。我到处搜索这个,我找不到解释为什么。所以我决定使用数组分配内存。如果你能回答这个问题,那将是非常有帮助的。谢谢。

0 投票
3 回答
42 浏览

python - 请让我清楚这一点

尽管输入了存储的值,即 23,但上面的代码不接受 else 条件并且不打印消息。

请帮我理解。

0 投票
1 回答
140 浏览

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

GCC C++ 编译器(也包括许多其他 C++ 编译器)提供非标准扩展,例如

  • alloca()基于堆栈的分配
  • 可变长度数组,因为它们是 C 标准的一部分

从基本的角度来看,这些可以在 C++20 协程中使用吗?有可能吗?如果是的话,这是如何实现的?

据我了解,C++20 协程通常会在第一次调用时(即创建承诺对象时)为协程创建堆栈帧,因此需要知道协程堆栈帧的大小。

然而,这不能很好地与 alloca 或其他运行时动态堆栈分配一起使用。

那么有没有可能,如果有,它是如何实施的?或者有什么影响?

0 投票
0 回答
49 浏览

c++ - 如何获取存储在 llvm 指针指向的内存中的数据

我正在构建一个将 armv7m 汇编指令转换为 llvm IR 的升降器。我的 C++ 代码示例是:

IRBuilder<> builder(TheContext); //第0行

llvm::ConstantInt* I_0 = llvm::ConstantInt::get(TheContext, llvm::APInt(/ nbits /32, 0, true)); //第 1 行

V = builder.CreateAlloca(Type::getInt32Ty(TheContext), nullptr, "V"); //第 2 行

值* s3 = builder.CreateStore(I_0, V, / isVolatile= /false); //第 3 行

Value* loaded_V = builder.CreateLoad(V); //第 4 行

值* result_V = builder.CreateICmpEQ(I_0, loaded_V); //第 5 行

结果_V->打印(错误());//第 6 行

我得到的结果是:

我想要的结果是:

所以我的问题是,即使我在第 3 行中的 ptr V 指向的内存位置存储了一个即时值 0。当我使用第 4 行中的 ptr V 的内存加载从内存中加载这个值然后将其与第 5 行的 icmpEq 中的立即值为 0,为什么我在第 6 行中没有得到一个真实的结果,但似乎loaded_V 没有计算为立即值 0,它只是由变量 %18 表示。

1-如何获取存储在 llvm 变量 %18 中的值?

2-有没有办法直接获取存储在ptr V指向的内存地址中的数据而无需加载。

正如您在我的代码的另一个示例中看到的那样,我试图将汇编指令 add DST, SRC1, SRC2转换为等效的 llvm IR:

我使用 alloca 指令将操作数表示为内存地址的 ptr,然后在 llvm 指令创建中使用操作数时从该内存地址加载。

3-是否有更好的方法来表示操作数(虚拟寄存器?!,而不是 ptrs 到内存)。

0 投票
1 回答
115 浏览

c++ - 如何在 Win32 C++ 项目中使用 _malloca 而不是 _alloca?

我正在更新一个旧的 C++ DLL 项目。对于导出的函数之一,有

W2A宏定义为

Visual Studio 2019 使用以下编译器警告标记 W2A 宏

我将如何对 W2A 宏进行建议的更改?还是我应该忽略警告?

之后

我的USES_CONVERSION 宏定义为

0 投票
4 回答
118 浏览

c - 如果我想要一个全局 VLA,我可以在主函数中使用 alloca() 吗?

我的应用程序有一个main功能,例如,我分配了配置文件的路径等。目前我malloc用于它们,但它们从未被释放并且在应用程序的整个生命周期中始终可用。我什至从未释放它们,因为当应用程序终止时操作系统已经自动回收分配的内存。此时,是否有任何理由不使用allocamalloc 代替,因为程序在main返回时结束,并且alloca只有在释放分配它的函数后才会删除内存。所以基于这个逻辑,在主函数中分配的内存alloca只有在程序结束时才被释放,这是所需的。这些陈述是否正确,是否有任何理由不使用allocaalloca 是不好的做法所以当我说 alloca 的意思是 allocamain在) 中制作一个 VLA 时,它main是一个“全局 VLA”之类的对象,它会持续到程序终止?