Mat*_* M. 13 c++ variable-length-array
看看这个问题:为什么C/C++编译器在编译时需要知道数组的大小?它来到我身边,编译器实现者应该有一些时间来弄清楚它(它是C99标准的一部分,那是10年前)并提供有效的实现.
然而,(从答案中)似乎仍然被认为是昂贵的.
这让我感到惊讶.
当然,我理解静态偏移在性能方面比动态偏移要好得多,并且不像一个建议我实际上不会让编译器执行数组的堆分配,因为这可能会花费更多[这没有被测量;)]
但我仍然对所谓的成本感到惊讶:
当然,问题出现在多个VLA上,我想知道是否有专用的VLA堆栈可行.这意味着VLA将由计数和指针(因此已知大小)表示,并且在辅助堆栈中采用的实际内存仅用于此目的(因此也是堆栈).
[改述]
如何在gcc/VC++中实现VLA?
成本真的令人印象深刻吗?
[结束改写]
在我看来,它只能比使用a vector,即使现有的实现更好,因为你不会产生动态分配的代价(以不可调整大小为代价).
编辑:
有部分反应在这里,但是比较沃拉斯传统阵列似乎不公平.如果我们事先知道尺寸,那么我们就不需要VLA了.在同一个问题中,AndreyT给出了一些关于实现的指示,但它并不像我想的那样精确.
VLA 在 gcc / VC++ 中是如何实现的?
AFAIK VC++ 没有实现 VLA。它是一个 C++ 编译器,仅支持 C89(无 VLA,无限制)。我不知道 gcc 如何实现 VLA,但最快的方法是将指向 VLA 的指针及其大小存储在堆栈帧的静态部分中。通过这种方式,您可以访问具有恒定大小数组性能的 VLA 之一(如果堆栈像 x86 中那样向下增长,则它是最后一个 VLA(取消引用 [堆栈指针 + 索引 * 元素大小 + 最后临时推送的大小]),以及第一个 VLA(如果它向上增长)(取消引用 [堆栈帧指针 + 堆栈帧偏移量 + 索引*元素大小])。所有其他 VLA 将需要再一次间接从堆栈的静态部分获取其基地址。
[编辑:此外,当使用VLA时,编译器不能省略堆栈帧基指针,否则这是多余的,因为可以在编译时计算堆栈指针的所有偏移量。这样你就少了一个免费注册机。-编辑结束]
成本真的那么可观吗?
并不真地。此外,如果您不使用它,则无需付费。
[编辑:可能更正确的答案是:与什么相比?与堆分配向量相比,访问时间相同,但分配和释放速度更快。-编辑结束]
| 归档时间: |
|
| 查看次数: |
1078 次 |
| 最近记录: |