gcc 对 VLA 的 sizeof 运算符的评估是否不同?

发布于 2024-12-24 18:30:45 字数 587 浏览 3 评论 0原文

g++ 允许可变长度数组 (VLA) 作为扩展。 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) 的情况下,g++ 是否不遵循仅评估 sizeof 的标准在编译时? sizeof 是否超载

g++ allows Variable Length Arrays (VLA) as an extension. The results of sizeof operator on VLAs are interesting:

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)
}

In case of sizeof(b), is g++ not following the standard where sizeof is evaluated only at compile time? Is sizeof overloaded?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

凉城已无爱 2024-12-31 18:30:45

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

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

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

VLAs are an exception to the rule that the operand of sizeof is not evaluated, as specified in C99, 6.5.3.4/2:

If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.

This behaviour is a g++ extension; in Standard C++ (up to and including C++14) the operand of sizeof is never evaluated (and VLAs are not permitted).

与风相奔跑 2024-12-31 18:30:45

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

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

VLAs were introduced in C99. In C99, sizeof(vla) is not a compile-time constant, but takes into account the run-time size of the array.

gcc/g++ allow VLAs in non-C99 code, as an extension. When doing so, the compilers follow the C99 semantics. This is what you're observing.

凹づ凸ル 2024-12-31 18:30:45

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

Variable Length Arrays are a part of C99, which is not in C++. Gcc allows them as an extension in C++ using the behaviour from C99, which does indeed say that sizeof returns the actual size of the array (and is therefore evaluated at runtime). The wikipedia article about sizeof gives a nice summary of its behaviour.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文