空结构和匿名联合奇怪的情况

use*_*817 14 c++ struct sizeof unions

编译我的代码为C++ 11 gcc 4.8.2llvm/clang 3.4在Fedora Linux的,我得到了奇怪的结果,我真的无法解释...这里是一个类似的计划的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;
}
Run Code Online (Sandbox Code Playgroud)

sizeof(B1) = 2sizeof(B2) = 1

但为什么尺寸不同?实际上我有一个"为什么"的想法,但我想找到确切的解释或C++规则.

Mar*_*k B 6

B1孩子有两个家长和类型的子对象A.相同类型的两个不同对象不能存在于同一地址,并且union分别包含A父对象的附加对象A.

使用时B2,空基础优化允许空A父母和C成员共享子项的单个地址.