首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我不明白为什么'Derived1‘需要和'Derived3’一样多的内存

我不明白为什么'Derived1‘需要和'Derived3’一样多的内存
EN

Stack Overflow用户
提问于 2018-07-17 20:02:59
回答 2查看 214关注 0票数 6

在下面的代码中,我不明白为什么'Derived1‘需要和'Derived3’一样多的内存。另外,派生4的大小为16是否有任何特定的意义。

代码语言:javascript
复制
#include <iostream>
using namespace std;

class Empty
{};

class Derived1 : public Empty
{};

class Derived2 : virtual public Empty
{};

class Derived3 : public Empty
{    
    char c;
};

class Derived4 : virtual public Empty
{
    char c;
};

class Dummy
{
    char c;
};

int main()
{
    cout << "sizeof(Empty) " << sizeof(Empty) << endl;
    cout << "sizeof(Derived1) " << sizeof(Derived1) << endl;
    cout << "sizeof(Derived2) " << sizeof(Derived2) << endl;
    cout << "sizeof(Derived3) " << sizeof(Derived3) << endl;
    cout << "sizeof(Derived4) " << sizeof(Derived4) << endl;    
    cout << "sizeof(Dummy) " << sizeof(Dummy) << endl;

    return 0;
}

这段代码的输出是:

代码语言:javascript
复制
sizeof(Empty) 1
sizeof(Derived1) 1
sizeof(Derived2) 8
sizeof(Derived3) 1
sizeof(Derived4) 16
sizeof(Dummy) 1
EN

回答 2

Stack Overflow用户

发布于 2018-07-17 20:10:40

classsizeof必须为1或更大,否则指针算法将严重崩溃,并且该class的数组元素将全部占用相同的内存。

因此,与sizeof(Empty)一样,sizeof(Derived1)至少为1。空基优化意味着派生类的大小实际上是零。

由于单个成员是char,因此sizeof(Derived3)也可以是1。请注意,编译器在这里再次利用了空基优化。

多态类(即那些包含virtual关键字的类)具有更大的大小,这是因为您的编译器实现了多态行为的要求。

票数 8
EN

Stack Overflow用户

发布于 2018-07-17 20:14:56

在下面的代码中,我不明白为什么'Derived1‘需要和’

‘一样多的内存。

与所有其他对象不同,允许空的基本子对象与其同级对象共享其地址。因此,空库不需要占用任何内存。

除了的空基外,Derived3只包含一个char对象。char的大小是1,因此Derived3适合1的大小。

除了空的基外,Derived1什么也不包含。但由于所有对象(不包括涉及子对象的例外)都必须有唯一的地址,所以任何类型的最小大小都是1,因此Derived1的大小是1。

派生4的大小是否也有任何特定的意义为16。

没有任何意义。其大小是相当典型的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51380901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档