2

g++允许可变长度数组 (VLA)作为扩展。sizeofVLA 上的operator的结果很有趣:

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 超载

4

3 回答 3

4

VLA 是不计算其操作数的规则的一个例外sizeof,如 C99, 6.5.3.4/2 中所述:

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

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

于 2012-01-03T16:48:19.430 回答
4

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

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

于 2012-01-03T16:48:50.020 回答
3

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

于 2012-01-03T16:48:33.513 回答