c++ sizeof 内存对齐探索

  1. 示例1:
  2. 示例2:
  3. 示例3:
  4. 示例4:
  5. 结论

测试环境:vs2013,win32平台

示例1:

class a
{
    int aa;
    char x;
};

class b :public virtual a
{
    char bb;
};

class c :public virtual b
{

};
class d :public b
{
    char dd;
};

sizeof(a), sizeof(b), sizeof(c), sizeof(d)的大小分别为:8, 16, 20, 20

示例2:

class a
{
    char aa;
};
class b :public virtual a
{
    char bb;
};
class c :public virtual b
{

};
class d :public b
{
    char dd;
};

sizeof(a), sizeof(b), sizeof(c), sizeof(d)的大小分别为:1, 9, 16, 13

示例3:

class a
{
    void fun();
};
class b :public virtual a
{
    char bb;
};
class c :public virtual b
{

};
class d :public b
{
    char dd;
};
class e : public a
{
    virtual ~e();
};

sizeof(a), sizeof(b), sizeof(c), sizeof(d), sizeof(e)的大小分别为:1, 8, 12, 12, 4

示例4:

class a
{
    char aa;
    char x;
};
class b :public virtual a
{
    char bb;
};
class c :public virtual b
{

};
class d :public b
{
    char dd;
};

sizeof(a), sizeof(b), sizeof(c), sizeof(d)的大小分别为:2, 10, 16, 14

结论

  1. 空类大小为1。因为空类也需要实例化,需要在内存中分配地址。所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有地址了。
  2. 内存对齐,类的大小,必须是其内部最大成员类型的整数倍,不足的要补齐。(使用#pragma pack(n)指定了对齐值的,按照指定值的整数倍对齐。)
  3. 子类只需要对齐自己内部数据(最大成员类型需要考虑基类中的最大成员类型),然后直接加上基类的size。
  4. 使用虚继承的子类中含有一个指向虚基类的指针。
  5. 每一个含有虚函数的类中都包含一个指向自己的虚(函数)表的指针。虚函数表的指针存在于对象实例中最前面的位置(为了保证最高性能)。
  6. 普通函数不占类的空间。

另:c++一个空的类也会产生6个默认函数:默认构造函数,默认析构函数,默认拷贝构造函数,默认复制函数(operator=),默认取地址函数(operator&),默认的const取地址函数(const operator&)。

图 A是基类,B继承A,C继承B

参考资料:
https://blog.csdn.net/lihao21/article/details/50688337


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 using1174@foxmail.com

文章标题: c++ sizeof 内存对齐探索

文章字数: 518

本文作者: Jun

发布时间: 2018-08-29, 11:38:00

最后更新: 2022-04-17, 22:49:42

原始链接: http://yoursite.com/2018/08/29/c-内存对齐探索/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏