具有数组分配的编译器的不同行为

时间:2010-06-22 12:28:15

标签: 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 iTest[iLen];
    return;
}

它会编译吗?你怎么看?根据我对C(或C ++)的了解,这不应该编译,因为我可以用我想要的任何整数调用函数doSomething(),因此在编译时无法确定iTest数组的大小。但是,当我尝试用g ++编译它时,它工作得很好。现在我可以理解这里可能发生了什么 - 编译器注意到我只将一个编译时常量作为参数调用此函数。这里有一些严肃的优化...但是当我尝试使用MSVC ++ 2008编译它时,我得到了这个:

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

我的问题是:这如何符合语言的定义(C标准(C ++标准))? g ++是否可以进行这样的优化(在这种情况下很容易看到,但是第一次遇到它时,它出现在一个大型项目中,乍一看并没有多大意义)。

3 个答案:

答案 0 :(得分:5)

C99(最新版本的C标准)确实允许动态调整大小的数组。 但是,Visual Studio(仅实现C89支持)

不支持该功能

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

答案 1 :(得分:2)

动态大小的数组是C99的一个特性。如果你的编译器支持C99(GCC没有,VC没有完全) - 如果你抛出C99开关 - 那么这将编译。

答案 2 :(得分:0)

这不是标准的C ++(但标准C)。实现可以提供alloca(或_alloca with msvc),这几乎可以完成工作。