在 fedora-linux 上使用 gcc 4.8.2
和 llvm/clang 3.4
将我的代码编译为 C++11,我得到了我无法真正理解的奇怪结果解释...
这是一个类似的程序fedora。
#include <iostream>
using namespace std;
struct A {};
struct C {};
struct B1 : A { union { A a;}; };
struct B2 : A { union { C c;}; };
int main()
{
cout << sizeof(B1) << " " << sizeof(B2) << endl;
}
sizeof(B1) = 2
和 sizeof(B2) = 1
但是为什么尺寸不同?其实我有一个“为什么”的想法,但我想找到确切的解释或 C++ 规则。
最佳答案
B1
子对象同时具有 A
类型的父对象和子对象。同一类型的两个不同对象不能存在于同一地址,并且 union 单独包含一个附加的 A
到父 A
。
使用B2
,空基优化允许空A
父和C
成员共享子的单一地址。
关于c++ - 空结构和匿名 union 怪事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23498746/