为什么多重继承会增加对象的大小,尽管基数为空?

Pat*_*ski 17 c++ multiple-inheritance memory-layout visual-studio

鉴于此代码:

#include <iostream>

struct A {

};

struct B {

};

struct C {

};

struct E : A {
    int field;
};

struct F : A, B {
    int field;
};

struct G : A, B, C {
    int field;
};

int main() {
    std::cout << _MSC_VER << std::endl;
    std::cout << sizeof(E) << std::endl;
    std::cout << sizeof(F) << std::endl;
    std::cout << sizeof(G) << std::endl;
    int o;
    std::cin >> o;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

1900
4
8
8
Run Code Online (Sandbox Code Playgroud)

为什么会FG有大小8,即使他们的基地是空的?为什么尺寸E不会增加呢?

我正在使用Visual Studio Community 2015,版本14.0.25431.01 Update 3构建它.MSVC++版本显然是9.0.

怎么会?这种特殊的内存布局有什么理由呢?

Ker*_* SB 10

没有语言规则表明任何特定类型都需要具有任何特定大小,但char(size 1)除外,并且受限于类类型的完整对象具有非零大小.您的特定编译器在您的示例中布置类型的方式没有任何错误.

至于新问题,在你编辑之后:MSVC可能不会花费很多精力来优化多重继承,因为这是一个相对罕见的事情,你可以说它几乎没有回报.我对正在进行的真正的决策过程一无所知,但只是考虑到可能会有像这样的实用工程权衡取舍.


Zal*_*nGG 2

Visual Studio 2015 Update 2 添加了对空基类优化的支持。但是,由于更新应该在它们之间布局兼容,因此默认情况下不会启用优化;您需要使用 __declspec(empty_bases) 手动请求它。

VC的博客中有更多信息: https://blogs.msdn.microsoft.com/vcblog/2016/03/30/optimizing-the-layout-of-empty-base-classes-in-vs2015-update-2-3 /

一旦他们发布了主要的编译器版本更新,这最终将成为默认设置,允许他们破坏二进制兼容性。