Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么c++;取决于数据成员的公共/私有状态? 从我所知道的,C++中的一个类的大小取决于以下因素-< /p> 所有非静态数据成员的大小 数据成员的顺序 是否启用字节填充 其直接基类的大小 虚函数的存在性 继承模式(虚拟继承)_C++_Inheritance_Memory - Fatal编程技术网

为什么c++;取决于数据成员的公共/私有状态? 从我所知道的,C++中的一个类的大小取决于以下因素-< /p> 所有非静态数据成员的大小 数据成员的顺序 是否启用字节填充 其直接基类的大小 虚函数的存在性 继承模式(虚拟继承)

为什么c++;取决于数据成员的公共/私有状态? 从我所知道的,C++中的一个类的大小取决于以下因素-< /p> 所有非静态数据成员的大小 数据成员的顺序 是否启用字节填充 其直接基类的大小 虚函数的存在性 继承模式(虚拟继承),c++,inheritance,memory,C++,Inheritance,Memory,现在我已经创建了两个类,如下所示- class A{ int a; short s; int b; char d; };// kept a char at last on purpose to leave a "hole" class B : public A{ char c; }; 现在检查A和B的大小,我明白了 A的尺寸:16 B尺寸:16 我的假设是B类中的字符c被容纳在A类中留下的“洞”中 但是,让我困惑的是下面的场景,我将成员公开 c

现在我已经创建了两个类,如下所示-

class A{
    int a;
    short s;
    int b;
    char d;
};// kept a char at last on purpose to leave a "hole"

class B : public A{
    char c;  
};
现在检查A和B的大小,我明白了

  • A的尺寸:16
  • B尺寸:16
我的假设是B类中的字符c被容纳在A类中留下的“洞”中

但是,让我困惑的是下面的场景,我将成员公开

class A{
    public:
    int a;
    short d;
    int b;
    char s;
};

class B : public A{
    public:
    char c;
};
现在尺寸变大了

  • A的尺寸:16
  • B的尺寸:20
我似乎无法理解这种差异的原因。

安腾ABI定义了“用于布局的POD”类。拥有私有数据成员会取消类作为聚合的资格,因此在C++03中为POD:

POD结构是没有非静态数据的聚合类 非POD结构、非POD union(或此类类型的数组)类型的成员 或引用,并且没有用户定义的复制分配运算符和 用户定义的析构函数

作为一个豆荚类:

这些类型的dsize、nvsize和nvalign定义为它们的 普通尺寸和校准。这些属性只对你有意义 用作基类的非空类类型。我们忽略了尾巴 填充豆荚,因为早期版本的标准没有 允许我们将其用于任何其他用途,因为它有时允许 更快地复制类型


因此,在第一个例子中,<代码> A<代码>不是布局的POD,它的尾部填充可以用于 B::C< /Cord>,但是在第二个例子中,它是一个POD,它的尾部填充不能被重用。C++中的类的大小为什么依赖于数据成员的公共/私有状态?没有。这些都是依赖于编译器的实现细节。那么您使用的编译器是什么呢?@PaulMcKenzie实际上是这样的。标准要求具有相同访问权限的成员组合在一起,这样更改将改变编译器的填充策略。@NathanOliver,Monica,我不知道。你手头上有相关章节的参考资料吗?@RSahu现在查一下,把我的答案填紧。