为什么即使基数为空,多重继承也会增加对象的大小?

帕特里克(Patryk Czachurski)

给出以下代码:

#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

为什么会FG有大小8,即使他们的基地是空的?为何大小也E不会增加?

我正在使用Visual Studio Community 2015版本14.0.25431.01 Update 3构建它。MSVC ++版本显然是9.0。

怎么来的?这种特殊的内存布局有什么原理?

ZaldronGG

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么虚拟继承2类会增加对象大小?

来自分类Dev

使用Wrapper类会增加对象的大小吗?

来自分类Dev

为什么“空”会增加数组的长度,即使它表示空值也是如此?

来自分类Dev

为什么包装 setMouseCallback 会导致 Mat 对象为空?

来自分类Dev

当我实现基数为 2^20 的基数排序对大小为 500 万的数组进行排序时,为什么该程序会陷入无限循环?

来自分类Dev

为什么C ++中的析构函数会增加它们所在的对象的大小?

来自分类Dev

为什么即使定义了类,CSS 属性也会继承参数?

来自分类Dev

为什么即使对象显式初始化为 null,空检查也会失败

来自分类Dev

为什么即使我的程序没有创建任何新对象,堆利用率也会随着时间的推移而增加?

来自分类Dev

即使将指针分配为NULL,为什么指针的指针对象的大小也不为零?

来自分类Dev

为什么chown会增加docker映像的大小?

来自分类Dev

为什么imagemagick会增加我pdf的文件大小?

来自分类Dev

为什么强制转换会增加矩阵的行/列大小?

来自分类Dev

为什么增加一个附加对象不会损害以下功能的性能?

来自分类Dev

为什么我的组合框为空?即使不是空的

来自分类Dev

为什么将基数为 10 的数字转换为基数为 2 的数字时位会重复?

来自分类Dev

如何减少和增加对象上图像的大小-ThreeJS

来自分类Dev

C ++是否会动态增加对象数组的数组大小?

来自分类Dev

为什么FormData对象为空

来自分类Dev

为什么我的对象保持为空?

来自分类Dev

为什么 JSON 对象为空?

来自分类Dev

为什么在opencl中,随着消息大小的增加,带宽也会增加?

来自分类Dev

在计算对象中的字母数时,为什么需要在增加对象之前测试该属性是否存在?

来自分类Dev

为什么即使设置状态后状态仍然为空?

来自分类Dev

为什么损失会增加?

来自分类Dev

为什么DataContext无法继承构造为附加属性的对象?

来自分类Dev

当作为公共虚拟继承时,为什么类的大小会增加?

来自分类Dev

即使我没有发送任何流量,为什么CockroachDB的内存使用量也会增加?

来自分类Dev

为什么声明字符为“(空)”会引发异常?

Related 相关文章

  1. 1

    为什么虚拟继承2类会增加对象大小?

  2. 2

    使用Wrapper类会增加对象的大小吗?

  3. 3

    为什么“空”会增加数组的长度,即使它表示空值也是如此?

  4. 4

    为什么包装 setMouseCallback 会导致 Mat 对象为空?

  5. 5

    当我实现基数为 2^20 的基数排序对大小为 500 万的数组进行排序时,为什么该程序会陷入无限循环?

  6. 6

    为什么C ++中的析构函数会增加它们所在的对象的大小?

  7. 7

    为什么即使定义了类,CSS 属性也会继承参数?

  8. 8

    为什么即使对象显式初始化为 null,空检查也会失败

  9. 9

    为什么即使我的程序没有创建任何新对象,堆利用率也会随着时间的推移而增加?

  10. 10

    即使将指针分配为NULL,为什么指针的指针对象的大小也不为零?

  11. 11

    为什么chown会增加docker映像的大小?

  12. 12

    为什么imagemagick会增加我pdf的文件大小?

  13. 13

    为什么强制转换会增加矩阵的行/列大小?

  14. 14

    为什么增加一个附加对象不会损害以下功能的性能?

  15. 15

    为什么我的组合框为空?即使不是空的

  16. 16

    为什么将基数为 10 的数字转换为基数为 2 的数字时位会重复?

  17. 17

    如何减少和增加对象上图像的大小-ThreeJS

  18. 18

    C ++是否会动态增加对象数组的数组大小?

  19. 19

    为什么FormData对象为空

  20. 20

    为什么我的对象保持为空?

  21. 21

    为什么 JSON 对象为空?

  22. 22

    为什么在opencl中,随着消息大小的增加,带宽也会增加?

  23. 23

    在计算对象中的字母数时,为什么需要在增加对象之前测试该属性是否存在?

  24. 24

    为什么即使设置状态后状态仍然为空?

  25. 25

    为什么损失会增加?

  26. 26

    为什么DataContext无法继承构造为附加属性的对象?

  27. 27

    当作为公共虚拟继承时,为什么类的大小会增加?

  28. 28

    即使我没有发送任何流量,为什么CockroachDB的内存使用量也会增加?

  29. 29

    为什么声明字符为“(空)”会引发异常?

热门标签

归档