C++ 可变长度数组中的运行时惩罚?
参考Stackoverflow问题标题,我们知道以下内容有效C++ 可变长度数组中的运行时惩罚?,c++,C++,参考Stackoverflow问题标题,我们知道以下内容有效 void foo(int n) { int values[n]; //Declare a variable length array } 我已经读到这里存在一个小的运行时惩罚(在可变长度数组中)。有人能很好地解释一下这是什么吗 我也会尽我所能找到我读到的链接。很抱歉,我不能在这里提及它。IIRC,有GCC,有VLA的功能: 不会被内联 需要为帧指针使用一个额外的寄存器(即,-fomit frame pointer在非VLA
void foo(int n) {
int values[n]; //Declare a variable length array
}
我已经读到这里存在一个小的运行时惩罚(在可变长度数组中)。有人能很好地解释一下这是什么吗
我也会尽我所能找到我读到的链接。很抱歉,我不能在这里提及它。IIRC,有GCC,有VLA的功能:
- 不会被内联
- 需要为帧指针使用一个额外的寄存器(即,
在非VLA函数上工作),因此该函数需要执行的其他工作少了一个寄存器-fomit frame pointer
- 不会被内联
- 需要为帧指针使用一个额外的寄存器(即,
在非VLA函数上工作),因此该函数需要执行的其他工作少了一个寄存器-fomit frame pointer
- 不会被内联
- 需要为帧指针使用一个额外的寄存器(即,
在非VLA函数上工作),因此该函数需要执行的其他工作少了一个寄存器-fomit frame pointer
- 不会被内联
- 需要为帧指针使用一个额外的寄存器(即,
在非VLA函数上工作),因此该函数需要执行的其他工作少了一个寄存器-fomit frame pointer
vector
。如果你真的有一个指向你参考的问题的链接就好了。而且,在C++中,可变长度数组在C++中没有技术上的存在,尽管许多编译器将它作为扩展。大多数事物都有与之相关的成本。弗拉斯也不例外。当你说有惩罚时,你的意思是与什么相比?与我们使用int值等数组的正常方式相比[10]@JoachimPileborg:显然VLA并没有进入C++14,毕竟:遵循标准,使用vector
。如果你真的有一个指向你参考的问题的链接就好了。而且,在C++中,可变长度数组在C++中没有技术上的存在,尽管许多编译器将它作为扩展。大多数事物都有与之相关的成本。弗拉斯也不例外。当你说有惩罚时,你的意思是与什么相比?与我们使用int值等数组的正常方式相比[10]@JoachimPileborg:显然VLA并没有进入C++14,毕竟:遵循标准,使用vector
。如果你真的有一个指向你参考的问题的链接就好了。而且,在C++中,可变长度数组在C++中没有技术上的存在,尽管许多编译器将它作为扩展。大多数事物都有与之相关的成本。弗拉斯也不例外。当你说有惩罚时,你的意思是与什么相比?与我们使用int值等数组的正常方式相比[10]@JoachimPileborg:显然VLA并没有进入C++14:遵循标准,使用vector
。此外,如果VLA放在堆栈框架中其他变量之前,就不能再使用常量偏移来访问它们了。@BlagovestBuyukliev:这一点很好。虽然我认为通过使用堆栈或帧指针,可以使用常量偏移量(因此,VLA函数禁用-fomit帧指针的原因)。但是如果有变量放在两个VLA之间,那么我认为除了在运行时计算偏移量之外没有其他方法。即使VLA放在“最后”,也有多个VLA的情况。。。那么,除第一个地址外,所有地址都将取决于早期地址的累计大小。实际上,如果不在函数的内部{}
作用域(例如for
,while
)中获取变量所需的所有内存的最坏情况下的高水位线,就不能将非VLA内存放在第一位,因此性能影响不太可能局限于VLA访问,如果VLA放在堆栈帧中的其他变量之前,则不能再使用常量偏移来访问它们。@BlagovestBuyukliev:这一点很好。虽然我认为通过使用堆栈或帧指针,可以使用常量偏移量(因此,VLA函数禁用-fomit帧指针的原因)。但是如果有变量放在两个VLA之间,那么我认为除了在运行时计算偏移量之外没有其他方法。即使VLA放在“最后”,也有多个VLA的情况。。。那么,除第一个地址外,所有地址都将取决于早期地址的累计大小。实际上,如果不在函数的内部{}
作用域(例如for
,while
)中获取变量所需的所有内存的最坏情况下的高水位线,就不能将非VLA内存放在第一位,因此性能影响不太可能局限于VLA访问,如果VLA放在堆栈帧中的其他变量之前,则不能再使用常量偏移来访问它们。@BlagovestBuyukliev:这一点很好。虽然我认为通过使用堆栈或帧指针,可以使用常量偏移量(因此,VLA函数禁用-fomit帧指针的原因)。但是如果有变量放在两个VLA之间,那么我认为除了在运行时计算偏移量之外没有其他方法。即使VLA放在“最后”,也有多个VLA的情况。。。那么,除第一个地址外,所有地址将取决于