【发布时间】:2011-05-19 15:14:03
【问题描述】:
看到这个问题:Why does a C/C++ compiler need know the size of an array at compile time ? 我想到编译器实现者现在应该有一些时间来涉足(这是 C99 标准的一部分,那是 10 年前的事)并提供高效的实现。
但是,它似乎(从答案中)仍然被认为是昂贵的。
这让我有些吃惊。
当然,我知道静态偏移在性能方面比动态偏移要好得多,并且与一个建议不同,我实际上不会让编译器执行数组的堆分配,因为这可能会花费更多 [这还没有被测量;)]
但我仍然对假定的成本感到惊讶:
- 据我所知,如果函数中没有 VLA,那么就不会产生任何成本。
- 如果只有一个 VLA,则可以将它放在所有变量之前或之后,因此可以为大多数堆栈帧获得静态偏移量(或者在我看来,但我并不精通在堆栈管理中)
当然会出现多个 VLA 的问题,我想知道有一个专用的 VLA 堆栈是否可行。这意味着 VLA 将由一个计数和一个指针(因此具有已知大小)表示,并且在辅助堆栈中占用的实际内存仅用于此目的(因此实际上也是一个堆栈)。
[改写]
在 gcc / VC++ 中 VLA 是如何实现的?
成本真的那么高吗?
[结束改写]
在我看来,它只能比使用vector 更好,即使是目前的实现,因为您不会产生动态分配的成本(以不可调整大小为代价)。
编辑:
有部分回复here,但是将 VLA 与传统数组进行比较似乎不公平。如果我们事先知道尺寸,那么我们就不需要 VLA。在同一个问题中,AndreyT 给出了一些关于实现的指示,但并不像我想要的那么精确。
【问题讨论】:
-
@Matthieu M. 已删除。我一定在想别的事。
-
@Matthieu:你的想法对我来说似乎是合理的...... VLA 仅在超过 1 个时才建议开销(只需将其放在“已知大小的元素之后”,然后可以是已知偏移堆栈中的指针或额外调整,以指示后续 VLA 从何处开始。但根本看不到第二个堆栈有帮助。
-
@Tony:我想知道堆栈是如何实现的,如果实现意味着只有当前堆栈的顶部是已知的,那么您似乎有一个动态偏移计算,除非您使用第二个堆栈来存储 VLA 元素。如果您知道当前帧的顶部和底部,那么对于单个 VLA 元素来说很容易。无论如何,我只想知道它是如何完成的(目前)以及“成本”是多少。
-
问“为什么是功能 A 而不是功能 B?”在设计特定语言时通常没有用处。答案通常是主观的和不知情的。关于如何在 C 中实现 VLA 的问题将是客观的,并且可以得到令人满意的回答。
-
据我所知,Visual C++ 不支持 VLA。