【发布时间】:2017-03-14 02:21:13
【问题描述】:
鉴于此代码:
#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。
怎么会?如此奇特的内存布局有什么理由?
【问题讨论】:
-
为什么它应该是一个错误?你认为编译器违反了哪种语言规则?
-
@KerrekSB 也许是“你不为你不使用的东西付费”的非正式规则。虽然它不在标准中,但如果我认为它被违反了,我会担心。
-
有一天你会长大,可以自己买东西,better compiler :-)
-
我用 clang 和 g++ 编译它,两种情况下的输出都是 4 4 4。所以它必须特定于 Visual c++。正如其他人所提到的,这不是一个错误,它只是编译器的一个选择。
-
也许 OP 应该删除“这可能是编译器错误”语句,这样人们就可以专注于“怎么来”部分。
标签: c++ visual-studio multiple-inheritance memory-layout