为什么空数组的大小为 0,而空类的大小不是 0

Why size of an empty array is 0 but size of an empty class is not 0?

本文关键字:小为 为什么 数组      更新时间:2023-10-16

例如:

int main() {
  struct {} foo;
  int bar[0];
  struct {
    int dummy[0];
  } baz;
  cout << sizeof(foo) << endl; //display '1'
  cout << sizeof(bar) << endl; //display '0'
  cout << sizeof(baz) << endl; //display '0'
  return 0;
}

请告诉我有什么理由支持编译器行为

这是一个

C++唯一的问题。在 C 语言中,编译器禁止空struct

在C++中,sizeof(foo) == 1的原因最终是为了可以强制执行C++标准的规则"任何对象在内存中都不得具有与任何其他变量相同的地址"。您可以在此处阅读详细信息。

编辑:关于user2864740关于baz的评论,它也应该是非零的是正确的。编译器允许空数组,这使得精细规则似乎没有像应用于foo那样一致地应用于baz。事实上,这确实弄乱了指针算法。请参阅此示例:

// C++14 code
#include <iostream>
using namespace std;
int main() {
  struct baz {
    int dummy[1];
  };
  cout << sizeof(baz) << endl;
  baz* arr;
  arr = new baz[5];
  cout << &arr[0] << endl;
  cout << &arr[1] << endl;
  return 0;
}
// everything looks good
4
0x892c008
0x892c00c

但是如果我们使用相同的代码并将 baz 中的数组更改为 int dummy[0]; ,那么我们得到以下输出:

0
0x8fe3008
0x8fe3008

确实很危险;这可能导致无限循环。建议你不要像这样淘气,即使你已经找到了逃脱的方法:)

编辑:假设 g++

sizeof返回对象的大小(以字节为单位 http://en.cppreference.com/w/cpp/language/sizeof

空数组的大小为 0,因为其中没有字节。结构的大小,一般不为零。如果编译器确定结构为空,则它将报告零。

在您的情况下,编译器可以判断结构中的字节数为零。因此,sizeof(bar)sizeof(baz) 为零

另请参阅此处 http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#The-sizeof-Operator

相关文章: