gcc对vla的sizeof操作符的计算方式是否不同



g++允许可变长度数组(VLA)作为扩展。sizeof算子在VLAs上的结果很有趣:

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过载了吗?

vla是不计算sizeof操作数规则的例外,如C99, 6.5.3.4/2:

所述

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

这个行为是一个c++扩展;在标准c++(包括c++ 14)中,sizeof的操作数永远不会被求值(并且不允许使用vla)。

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

gcc/g++允许vla在非c99代码中作为扩展。当这样做时,编译器遵循C99语义。

可变长度数组是C99的一部分,不在c++中。Gcc允许它们在c++中使用C99的行为作为扩展,C99确实说sizeof返回数组的实际大小(因此在运行时计算)。维基百科关于sizeof的文章很好地总结了它的行为。

相关内容

  • 没有找到相关文章

最新更新