c++ - 空结构和匿名 union 怪事

标签 c++ struct sizeof unions

在 fedora-linux 上使用 gcc 4.8.2llvm/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) = 2sizeof(B2) = 1

但是为什么尺寸不同?其实我有一个“为什么”的想法,但我想找到确切的解释或 C++ 规则。

最佳答案

B1 子对象同时具有 A 类型的父对象和子对象。同一类型的两个不同对象不能存在于同一地址,并且 union 单独包含一个附加的 A 到父 A

使用B2,空基优化允许空A父和C成员共享子的单一地址。

关于c++ - 空结构和匿名 union 怪事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23498746/

相关文章:

c - 为什么 sizeof 的赋值会改变从 size_t 赋值给 int 的变量类型?

c++ - 使用按位或代替 std::max 来调整缓冲区大小

c++ - 具有 const 引用的可变参数模板

c++ - 通过 C API 提供 QWidget 的 DLL

c++ - C++:静态断言参数包与函数类型匹配

c++ - 返回对结构数组的引用

c++ - OpenCV 在 Windows 和 Linux 上的不同结果

c - 结构中的大小

c - 带有使用关键字 "extern"的结构体和函数原型(prototype)的头文件

c# - 为什么 C# 中的 sizeof(bool) == sizeof(byte)?