看这个问题:为什么 C/C++ 编译器需要在编译时知道数组的大小?我想到编译器实现者现在应该有一些时间来涉足(这是 10 年前的 C99 标准的一部分)并提供有效的实现。
然而,它似乎(从答案)仍然被认为是昂贵的。
这不知何故让我感到惊讶。
当然,我知道静态偏移在性能方面比动态偏移要好得多,并且与一个建议不同,我实际上不会让编译器执行数组的堆分配,因为这可能会花费更多[这没有被测量了;)]
但我仍然对假定的成本感到惊讶:
- 据我所知,如果函数中没有 VLA,那么就不会有任何成本。
- 如果只有一个 VLA,那么可以将它放在所有变量之前或之后,因此可以获得大部分堆栈帧的静态偏移量(或者在我看来,但我并不精通堆栈管理)
当然,多个 VLA 的问题出现了,我想知道是否有一个专用的 VLA 堆栈会起作用。这意味着 VLA 将由一个计数和一个指针(因此具有已知大小)表示,并且在辅助堆栈中占用的实际内存仅用于此目的(因此实际上也是一个堆栈)。
[改写]
VLA 如何在 gcc / VC++ 中实现?
成本真的那么可观吗?
[结束改写]
在我看来vector
,即使使用当前的实现,它也只能比使用 a 更好,因为您不会产生动态分配的成本(以不可调整大小为代价)。
编辑:
这里有部分回应,但是将 VLA 与传统阵列进行比较似乎不公平。如果我们事先知道尺寸,那么我们就不需要 VLA。在同一个问题中,AndreyT 给出了一些关于实现的指示,但它并不像我想要的那样精确。