【发布时间】:2021-11-08 03:25:18
【问题描述】:
这是问题:
如何在机器代码(或汇编代码——我不想看到一些二进制代码)级别实现可变长度数组?由于许多局部变量存储在.data 段中,我想必须做一些不同的事情来支持 VLA。
这是我做的一个实验,但没有帮助我找到答案:
我试图通过用 C 编写一段非常短的代码,然后反汇编编译后的输出来获得一些关于这个问题的答案的线索。
代码如下:
1 int main()
2 {
3
4 int n = 255;
5
6 int array[n];
7
8 array[0] = 15;
9
10 }
使用gcc main.c 编译。用objdump a.out -M intel -d拆解。请注意,我可能会使用一些更好的编译器选项或 objdump 命令的选项来简化输出,但我不确定这些可能是什么。
产生的输出比我最初预期的要长得多,通过它我没有发现任何能够回答问题的明显内容。
【问题讨论】:
-
本地(又称自动)变量永远不会存储在数据段中。它们存储在堆栈中。我可以很快写一个更详细的答案。
-
gcc -O0用于 VLA is really dumb 的 asm,使用实际的div将分配大小四舍五入为 16 字节 IIRC 的倍数。查看一个函数,它接受一个函数 arg,并将指向 VLA 的指针传递给另一个函数,这样您就可以优化而不优化 VLA。 godbolt.org/z/ax7a18bzY / How to remove "noise" from GCC/clang assembly output? -
我对@987654324@ 有一个半完成的回答,我坐在某个我可以完成的地方。不过也相关:Understanding GCC's alloca() alignment and seemingly missed optimization
标签: assembly machine-code variable-length-array