鉴于此代码:
#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 Update 3 构建它。MSVC++ 版本显然是 9.0。
怎么会?如此奇特的内存布局有什么理由?
最佳答案
没有语言规则规定任何特定类型需要具有任何特定大小,char
(大小 1)除外,并且受类类型的完整对象具有的约束非零大小。您的特定编译器在示例中布置类型的方式没有任何问题。
至于新问题,在您编辑之后:MSVC 可能只是没有在优化多重继承方面投入大量精力,因为这是一件相对罕见的事情,您可以争辩说没有什么返回。我对正在进行的真正决策过程一无所知,但请考虑一下可能存在这样的务实工程权衡。
关于c++ - 尽管基数为空,为什么多重继承会增加对象的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40351699/