当前位置:  开发笔记 > 编程语言 > 正文

当我从虚拟基础派生D时,为什么在VS2015中sizeof(D)增加了8个字节?

如何解决《当我从虚拟基础派生D时,为什么在VS2015中sizeof(D)增加了8个字节?》经验,为你挑选了0个好方法。

我正在使用C++14§3.11/ 2中的示例:

struct B { long double d; };
struct D : virtual B { char c; }

在clang,g ++和VS2015中运行下面的代码片段之后

#include 
struct 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?

我知道这是实现定义的,但是对于这种大小的增加可能有一个合理的解释.如果可能的话,这就是我想知道的.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有