我正在使用C++14§3.11/ 2中的示例:
struct B { long double d; }; struct D : virtual B { char c; }
在clang,g ++和VS2015中运行下面的代码片段之后
#includestruct B { long double d; }; struct D : /*virtual*/ B { char c; }; int main() { std::cout << "sizeof(long double) = " << sizeof(long double) << '\n'; std::cout << "alignof(long double) = " << alignof(long double) << '\n'; std::cout << "sizeof(B) = " << sizeof(B) << '\n'; std::cout << "alignof(B) = " << alignof(B) << '\n'; std::cout << "sizeof(D) = " << sizeof(D) << '\n'; std::cout << "alignof(D) = " << alignof(D) << '\n'; }
我得到了以下结果:
clang g++ VS2015 sizeof(long double) 16 16 8 alignof(long double) 16 16 8 sizeof(B) 16 16 8 alignof(B) 16 16 8 sizeof(D) 32 32 16 alignof(D) 16 16 8
现在,在取消上面代码virtual
中的定义struct D
并再次为clang,g ++和VS2015运行代码之后,我获得了以下结果:
clang g++ VS2015 sizeof(long double) 16 16 8 alignof(long double) 16 16 8 sizeof(B) 16 16 8 alignof(B) 16 16 8 sizeof(D) 32 32 24 alignof(D) 16 16 8
我对上面得到的结果毫不怀疑,只有一个例外:为什么sizeof(D)
在VS2015中从16增加到24?
我知道这是实现定义的,但是对于这种大小的增加可能有一个合理的解释.如果可能的话,这就是我想知道的.