Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变长度数组中的运行时惩罚?_C++ - Fatal编程技术网

C++ 可变长度数组中的运行时惩罚?

C++ 可变长度数组中的运行时惩罚?,c++,C++,参考Stackoverflow问题标题,我们知道以下内容有效 void foo(int n) { int values[n]; //Declare a variable length array } 我已经读到这里存在一个小的运行时惩罚(在可变长度数组中)。有人能很好地解释一下这是什么吗 我也会尽我所能找到我读到的链接。很抱歉,我不能在这里提及它。IIRC,有GCC,有VLA的功能: 不会被内联 需要为帧指针使用一个额外的寄存器(即,-fomit frame pointer在非VLA

参考Stackoverflow问题标题,我们知道以下内容有效

void foo(int n) {
    int values[n]; //Declare a variable length array
}
我已经读到这里存在一个小的运行时惩罚(在可变长度数组中)。有人能很好地解释一下这是什么吗


我也会尽我所能找到我读到的链接。很抱歉,我不能在这里提及它。

IIRC,有GCC,有VLA的功能:

  • 不会被内联
  • 需要为帧指针使用一个额外的寄存器(即,
    -fomit frame pointer
    在非VLA函数上工作),因此该函数需要执行的其他工作少了一个寄存器

IIRC,带有GCC,具有VLA的功能:

  • 不会被内联
  • 需要为帧指针使用一个额外的寄存器(即,
    -fomit frame pointer
    在非VLA函数上工作),因此该函数需要执行的其他工作少了一个寄存器

IIRC,带有GCC,具有VLA的功能:

  • 不会被内联
  • 需要为帧指针使用一个额外的寄存器(即,
    -fomit frame pointer
    在非VLA函数上工作),因此该函数需要执行的其他工作少了一个寄存器

IIRC,带有GCC,具有VLA的功能:

  • 不会被内联
  • 需要为帧指针使用一个额外的寄存器(即,
    -fomit frame pointer
    在非VLA函数上工作),因此该函数需要执行的其他工作少了一个寄存器


如果您真的有一个指向您参考的问题的链接,那就太好了。而且,在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
。如果你真的有一个指向你参考的问题的链接就好了。而且,在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的情况。。。那么,除第一个地址外,所有地址将取决于