是否通过gcc对sizeof运算符进行了不同的VLA评估?

时间:2012-01-03 16:39:51

标签: c++ gcc sizeof variable-length-array

g++允许可变长度数组(VLA)作为扩展名。 sizeof运算符对VLA的结果很有意思:

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),g ++是否遵循仅在编译时评估sizeof的标准?是sizeof overloaded吗?

3 个答案:

答案 0 :(得分:4)

VDA是对sizeof的操作数未评估的规则的例外,如C99,6.5.3.4/2中所述:

  

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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