inline int createVLA(int size)
{
int VLA[size];//compiler can deduce that size == 7
return sizeof(VLA);
}
int main()
{
int i = 5;
return createVLA(i + 2);
}
我知道该程序在技术上几乎可以全部优化,但是想象一下是否实际使用VLA。
就像其他有关优化的所有内容一样,它取决于上下文。 通常,无论vla还是静态大小,任何本地阵列都会分配在堆栈上,因此,这只是基于编译时常数或运行时值保留堆栈空间的问题。根据ISA的不同,这可能是几个CPU的差异 - 这种微观优化甚至没有意义。在您的示例中,数组可能根本没有分配,因为与之相关的无需副作用,并且编译器可以将值加载到寄存器中并返回。
我们必须修改程序以注意差异。例如:
dopping
#define SIZE size
int createArray (int size)
{
int VLA[SIZE];
for(int i=0; i<SIZE; i++)
{
volatile int tmp=0;
VLA[i] = tmp;
}
return sizeof(VLA);
}
意味着这与外部链接和无内线进行编译。此外,
main()
访问迫使循环执行。
现在,我得到的代码完全不同,具体取决于
volatile
。使用GCC 14.2 x86SIZE
-O3
产生一个上的循环,但没有分配的阵列。 #define SIZE size
读为被丢弃的寄存器。
0
产生一个下限循环,否则与上述相同。
#define SIZE 100
无循环 - 它是展开的 - 但没有数组分配。
#define SIZE 10
具有函数,那么这仍然可以是呼叫者端分配,并且我们可以将静态大小的数组传递给此功能。因此,vla本身是模糊的。
一般的经验法则是,大阵列不应在堆栈,VLA或没有VLA上分配。因为它们将有助于堆栈最佳使用,并且存在堆栈溢出的潜力。