给出以下代码:
#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。
怎么来的?这种特殊的内存布局有什么原理?
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 /
一旦他们发布了主要的编译器版本更新,这将最终成为默认设置,使他们可以破坏二进制兼容性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句