【发布时间】:2017-02-04 10:00:21
【问题描述】:
假设我有一个从紧密循环中调用的函数,它在一种情况下在堆栈上分配一些大型 POD 数组(无构造函数),而我动态分配数组一次并在每次迭代中重用它们。本地数组是否会增加运行时成本?
据我了解,分配本地 POD 变量归结为移动堆栈指针,因此它应该无关紧要。但是,我想到了一些可能会影响性能的事情:
检查堆栈溢出 - 这些检查由谁以及何时进行,多久检查一次?在某些系统上,堆栈可以自动增长,但同样,我对此知之甚少。
缓存注意事项:CPU 缓存是否以特殊方式处理堆栈,还是与其余数据没有区别?
可变参数数组与上面的有什么不同吗?比如说,对于固定大小的数组,堆栈可以以某种方式预先分配(或由编译器预先计算?),而对于可变参数数组,则涉及其他增加运行时成本的东西。同样,我不知道这是如何工作的。
【问题讨论】:
-
选择一种语言。它们是不同的语言,具有非常不同的编译器。并指定您的平台
-
C++ 没有变长数组。
-
@kfsone:它们还没有标准语法,但通常可以通过
_alloca()获得可变长度自动存储 -
@kfsone clang(也可能是 gcc)允许我轻松混合 C 和 C++ 标准的功能,但在某些情况下您应该禁止编译器警告。
-
@BenVoigt:
_alloca()是一个依赖于平台的 C 函数而不是标准的。它还具有与 VLA 不同的语义。
标签: c arrays variable-length-array