c++ - 为什么空基类会占用空间作为成员变量?
问题描述
据我了解,当我的类型派生自没有数据成员或虚函数的基类时,空基类优化 (EBO) 应该生效。在 GCC 和 Clang 下,这不会发生。这是一个示例:
struct EmptyClass { };
struct SmallerClass : public EmptyClass {
long long int _x[2];
};
struct BiggerClass : public EmptyClass {
SmallerClass _sc;
};
struct BiggestClass : public EmptyClass {
BiggerClass _bc;
SmallerClass _sc;
};
我完全期望 的大小BiggestClass
等于 4 long long int
s (32) 的大小,但我在调试器中注意到它实际上是 48。检查 Clang ( clang++ -cc1 -std=c++14 -fdump-record-layouts
) 和 GCC ( g++ -std=c++14 -fdump-lang-all -c
) 中的 AST 都表明我EmptyClass
正在占用空间每个包含它的类(对于BiggestClass
,它出现两次)。
这是 Clang AST 输出:
*** Dumping AST Record Layout
0 | struct EmptyClass (empty)
| [sizeof=1, dsize=1, align=1,
| nvsize=1, nvalign=1]
*** Dumping AST Record Layout
0 | struct SmallerClass
0 | struct EmptyClass (base) (empty)
0 | long long [2] _x
| [sizeof=16, dsize=16, align=8,
| nvsize=16, nvalign=8]
*** Dumping AST Record Layout
0 | struct BiggerClass
0 | struct EmptyClass (base) (empty)
8 | struct SmallerClass _sc
8 | struct EmptyClass (base) (empty)
8 | long long [2] _x
| [sizeof=24, dsize=24, align=8,
| nvsize=24, nvalign=8]
*** Dumping AST Record Layout
0 | struct BiggestClass
0 | struct EmptyClass (base) (empty)
8 | struct BiggerClass _bc
8 | struct EmptyClass (base) (empty)
16 | struct SmallerClass _sc
16 | struct EmptyClass (base) (empty)
16 | long long [2] _x
32 | struct SmallerClass _sc
32 | struct EmptyClass (base) (empty)
32 | long long [2] _x
| [sizeof=48, dsize=48, align=8,
| nvsize=48, nvalign=8]
因此,它似乎不仅BiggestClass
比我预期的要大,BiggerClass
而且尺寸也受到了影响。看起来嵌套类会删除优化。
删除优化背后的原因是什么,有没有办法让我用一个共同的(空的)祖先来组合这些类型?
解决方案
推荐阅读
- velo - WIX:Repeater 上的排序功能在预览中有效,但不适用于实时站点
- python - 要求用户输入海龟项目的屏幕尺寸
- vue.js - 如何在 Vuetify v-tooltip 中添加换行符
- python - MacBook Air MacOS Mojava (10.14.6) 使用 python turtle 模块崩溃或重启
- git - 尝试使用 Visual Studio Code 解决合并冲突
- flutter - 我对个性化文本有疑问
- c# - 正则表达式匹配自定义文本
- unit-testing - 如何验证使用 moto mock cognitoidp 生成的 JWT 令牌
- python - 尝试在 Tkinter 中添加返回按钮命令的函数
- javascript - 如何从 Selenium/Python 的父节点中删除/排除选定的子节点?