首页 > 解决方案 > 为什么空基类会占用空间作为成员变量?

问题描述

据我了解,当我的类型派生自没有数据成员或虚函数的基类时,空基类优化 (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 ints (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而且尺寸也受到了影响。看起来嵌套类会删除优化。

删除优化背后的原因是什么,有没有办法让我用一个共同的(空的)祖先来组合这些类型?

标签: c++oopsizesubclasscompiler-optimization

解决方案


推荐阅读