我知道VLA有自己的属性,但是阵列和已知尺寸的VLA之间是否有任何实际差异(性能或其他方式)? 例如: 内联int createvla(int s ...

问题描述 投票:0回答:1
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的差异 - 这种微观优化甚至没有意义。
在您的示例中,数组可能根本没有分配,因为与之相关的无需副作用,并且编译器可以将值加载到寄存器中并返回。

我们必须修改程序以注意差异。例如:

c optimization
1个回答
0
投票

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 x86

SIZE


-O3
产生一个上的循环,但没有分配的阵列。
#define SIZE size
读为被丢弃的寄存器。

0

产生一个下限循环,否则与上述相同。
#define SIZE 100
无循环 - 它是展开的 - 但没有数组分配。

    因此,我们可以得出结论,为了实际迫使数组分配,它需要做一些有意义的事情或作为参数等通过,以防万一将其作为参数传递,谁负责分配该参数,取决于ABI。
  • 毫无疑问,指向VLA的指针与指针与一般数组兼容。因此,如果我们使用VLA
    #define SIZE 10
    具有函数,那么这仍然可以是呼叫者端分配,并且我们可以将静态大小的数组传递给此功能。因此,vla本身是模糊的。
    一般的经验法则是,大阵列不应在堆栈,VLA或没有VLA上分配。因为它们将有助于堆栈最佳使用,并且存在堆栈溢出的潜力。
        
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.