鉴于此代码:
#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
为什么F
和G
的大小为8
,即使它们的基数为空?
为什么E
的大小也不会增加?
我正在使用Visual Studio Community 2015,版本14.0.25431.01更新3构建它.MSVC ++版本显然是9.0。
为什么?这种特殊的记忆布局有什么理由呢?
答案 0 :(得分:10)
没有语言规则表明任何特定类型都需要具有任何特定大小,char
(大小为1)除外,并受限于类类型的完整对象具有非零值尺寸。您的特定编译器在您的示例中布置类型的方式没有任何错误。
关于新问题,在您编辑之后:MSVC可能没有花费大量精力来优化多重继承,因为这是一个相对罕见的事情,你可以认为有一点小小的回报。我对正在进行的实际决策过程一无所知,但只是考虑到可能会有这样的务实工程权衡取舍。
答案 1 :(得分: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/
一旦发布主要的编译器版本更新,它们最终将成为默认值,允许它们破坏二进制兼容性。