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

标签 c++ visual-studio multiple-inheritance memory-layout

鉴于此代码:

#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;
}

我得到以下输出:

1900
4
8
8

为什么 FG 的大小为 8,即使它们的基数为空? 为什么E的大小也不会增加?

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

怎么会?如此奇特的内存布局有什么理由?

最佳答案

没有语言规则规定任何特定类型需要具有任何特定大小,char (大小 1)除外,并且受类类型的完整对象具有的约束非零大小。您的特定编译器在示例中布置类型的方式没有任何问题。

至于新问题,在您编辑之后:MSVC 可能只是没有在优化多重继承方面投入大量精力,因为这是一件相对罕见的事情,您可以争辩说没有什么返回。我对正在进行的真正决策过程一无所知,但请考虑一下可能存在这样的务实工程权衡。

关于c++ - 尽管基数为空,为什么多重继承会增加对象的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40351699/

相关文章:

c++ - 我可以在 DLL 中创建第二个单例实例吗?

c++ - 链接 : fatal error LNK1104: cannot open file 'boost_program_options.lib'

c# - 使用 MSI 将 .NET 程序集安装到 GAC

c# - 尝试使用 CoreCon API 连接到设备时获取 DirectoryNotFoundException

C++多继承函数调用歧义

c++ - 我有不同的类,我想用这些类中的对象创建一个 vector 并按值对其进行排序

c++ - 在 For 循环中声明多个变量然后分配这些变量数据

c++ - “X 不是模板”错误

android - 继承ActionBarSherlock和Android YouTubePlayer

c++ - 返回一个模板,没有匹配的函数可供调用