2012-01-03 19 views
2

g++允许可变长度数组(VLA)作为扩展。 sizeof操作者对VLAS结果非常有趣:gof对VLA的sizeof运算符进行了不同的评估吗?

int main() 
{ 
    char size = 20, a[10], b[size]; 
    cout<<"sizeof(a) = "<<sizeof(a)<<endl; // sizeof(a) = 10, (can be used as template param) 
    cout<<"sizeof(b) = "<<sizeof(b)<<endl; // sizeof(b) = 20 !! (can't used be as template param) 
} 

sizeof(b)情况下,是克++不以下其中sizeof仅在编译时评估的标准是什么?是sizeofoverloaded

+0

括号不是运算符名称的一部分。它是'sizeof',而不是'sizeof()'。 – unwind 2012-01-03 16:41:00

回答

4

VLAS是一个例外规则的sizeof所述操作数未评价,如在C99指明,6.5.3.4/2:

如果操作数的类型是可变长度数组类型,操作数被评估;否则,操作数不计算,结果是一个整数常量。

此行为是g ++扩展;在标准C++(高达并包括C++ 14)中,sizeof的操作数永远不会被评估(并且不允许使用VLA)。

3

可变长度数组是C99的一部分,它不在C++中。 Gcc允许它们作为C++中的扩展,使用C99的行为,确实说sizeof返回数组的实际大小(因此在运行时进行评估)。 The wikipedia article about sizeof给出了它的行为的一个很好的总结。

4

在C99中引入了VLA。在C99中,sizeof(vla)不是编译时常量,但会考虑数组的运行时大小。

gcc/g++允许非C99代码中的VLA作为扩展。当这样做时,编译器遵循C99语义。这是你正在观察的。