假设我有以下函数,它使用可变长度数组:
void func(int size)
{
int var1;
int arr[size];
int var2;
...
}
编译器如何确定地址var2
?
我能想到的唯一方法就是放置arr
after var1
and var2
.
但那样的话,如果有多个变长数组怎么办?
将它们全部放在“正常”变量之后只会有助于解析第一个变量的地址。
我在这里隐含的假设是所有局部变量(包括 VLA)都在堆栈上分配。
我意识到它不是由 C99 标准定义的,所以问题本质上是关于编译的。
步骤 1:对于每个可变大小的项,创建一个包含指向数组的指针的隐藏变量,以及一个保存数组大小的隐藏变量。这些可以被优化掉,像任何其他变量一样分配给寄存器等。
步骤 2:以正常方式为不可变大小的项目分配空间。
步骤 3:处理可变尺寸项的声明,评估尺寸并将其存储到尺寸变量中。计算可变大小项目的空间,同时考虑对齐情况。在堆栈上为可变大小项腾出空间,然后将指向该项位置的指针存储到隐藏指针变量中。
步骤4:使用隐藏指针变量访问数组元素。使用 sizeof 运算符的隐藏大小变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)