C++ 使用数组分配的编译器的不同行为

C++ 使用数组分配的编译器的不同行为,c++,optimization,compiler-construction,compile-time-constant,C++,Optimization,Compiler Construction,Compile Time Constant,与MSVC++2008相比,我最近发现g++有一个有趣的行为。考虑这个小程序: #include <cstdlib> const int ARR_LENGTH = 512; void doSomething( int iLen ); int main( int argc, char** argv ) { doSomething( ARR_LENGTH ); return 0; } void doSomething( int iLen ) { int i

与MSVC++2008相比,我最近发现g++有一个有趣的行为。考虑这个小程序:

#include <cstdlib>

const int ARR_LENGTH = 512;

void doSomething( int iLen );

int main( int argc, char** argv )
{
    doSomething( ARR_LENGTH );
    return 0;
}

void doSomething( int iLen )
{
    int iTest[iLen];
    return;
}
我的问题是:这如何符合语言的定义(C标准(C++标准))?g++进行这样的优化(在本例中很容易看到,但我第一次遇到它时,它是在一个大型项目中,乍一看没有多大意义)是否合适。

C99(C标准的最新版本)允许动态调整阵列大小。 但是,Visual Studio不支持该功能(它仅实现C89支持)


<>在C++中,它不是,也可能永远不会有效。

< P>动态大小数组是C99的一个特性。如果您的编译器支持C99(GCC支持,VC不完全支持),并且如果您抛出C99开关,那么这将编译 AlcLoad()要好。Jalf说“可能永远不会有效”,这是一个很好的理由,认为C++委员会刚刚完成了C++下一个版本的标准编写,他们完全考虑了C99中添加的C的所有特性,而VLAS没有被接受。正如@Ben所说,它在即将到来的C++0x中被拒绝了,所以他们不得不改变这个决定,以便以后添加它。它在C++中没有必要,因为它在C++中已经有了<代码> STD::向量< /代码>,它解决了许多相同的问题。C++中对VLAs的需求更少了。
1>c:\prj\test\test.cpp(15) : error C2057: expected constant expression
1>c:\prj\test\test.cpp(15) : error C2466: cannot allocate an array of constant size 0
1>c:\prj\test\test.cpp(15) : error C2133: 'iTest' : unknown size