#include <iostream>
using namespace std;
class Empty{
char omg[0];
};
int main()
{
Empty em1, em2;
Empty set[100];
cout << sizeof(Empty) << " " << sizeof(em1) << " " << sizeof(em2) << endl;
cout << (long*)&em1 << " " << (long*)&em2 << endl;
cout << "total numbers of element is: " << sizeof(set)/sizeof(*set) << endl;
return 0;
}
它的输出是:
0 0 0
0xbff36ad0 0xbff36ac8
元素数量为:4
结果令人惊讶。
如上图,Empty是一个类,它的大小和它的对象都是0,为什么?
也许我猜,因为一个空类的大小是1,当类不为空时,它的大小是由成员决定的,但是这里它的成员是特殊的,它是一个长度为零的数组,而这个数组的大小是0,所以类和对象的大小都是0。
这只是我的猜测。随着程序的运行,我们可以看到两个对象都有地址,而且地址不同。
这里是我的问题:如果可以实现 0 大小的对象,为什么 C++ 标准规定空对象有 sizeof() = 1,它是为了“确保两个不同对象的地址会不同”为什么是大小一个空类不为零?, 但是现在,我们确实有不同的地址作为输出,这是怎么发生的?
更进一步,不管数组集合的大小,最后一行输出总是4,为什么?
谢谢 :)
PS:我在MacOS上运行这个程序,编译器是Apple LLVM 5.1版(clang-503.0.40)(基于LLVM 3.4svn)