例如:
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;
}
请告诉我有没有原因支持编译器行为
答案 0 :(得分:11)
这是一个仅限C ++的问题。在C中,编译器禁止空struct
。
在C ++中,sizeof(foo) == 1
的原因最终是为了使C ++标准的“无对象在内存中具有与任何其他变量相同的地址”的规则可以被强制执行。您可以阅读详细信息here。
编辑:关于user2864740
关于baz
出现的评论,它应该也是非零是正确的。编译器允许空数组使得看起来没有像baz
那样始终如一地将finessing规则应用于foo
。事实上,这确实搞乱了指针算法。见这个例子:
// 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
确实危险;这可能导致无限循环。建议你不要像这样顽皮,即使你已经找到了逃脱它的方法:)
答案 1 :(得分:2)
修改:假设g++
sizeof
以字节http://en.cppreference.com/w/cpp/language/sizeof
空数组的大小为0,因为其中没有字节。 struct的大小通常不为零。如果编译器发现结构为空,那么它将报告零。
在您的情况下,编译器可以告诉结构中的字节数为零。因此,sizeof(bar)
和sizeof(baz)
为零
另见http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#The-sizeof-Operator