【问题标题】:Is the sizeof operator evaluated differently for VLAs by gcc?gcc 对 VLA 的 sizeof 运算符评估是否不同?
【发布时间】:2012-02-01 16:21:19
【问题描述】:

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 的标准?是sizeofoverloaded吗?

【问题讨论】:

  • 括号不是运算符名称的一部分。这是sizeof,不是sizeof()

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-01-04
        • 2017-01-21
        • 2023-02-02
        • 2020-11-11
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多