c++ sizeof 内存对齐探索
测试环境: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。因为空类也需要实例化,需要在内存中分配地址。所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有地址了。
- 内存对齐,类的大小,必须是其内部最大成员类型的整数倍,不足的要补齐。(使用#pragma pack(n)指定了对齐值的,按照指定值的整数倍对齐。)
- 子类只需要对齐自己内部数据(最大成员类型需要考虑基类中的最大成员类型),然后直接加上基类的size。
- 使用虚继承的子类中含有一个指向虚基类的指针。
- 每一个含有虚函数的类中都包含一个指向自己的虚(函数)表的指针。虚函数表的指针存在于对象实例中最前面的位置(为了保证最高性能)。
- 普通函数不占类的空间。
另:c++一个空的类也会产生6个默认函数:默认构造函数,默认析构函数,默认拷贝构造函数,默认复制函数(operator=),默认取地址函数(operator&),默认的const取地址函数(const operator&)。
参考资料:
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" 转载请保留原文链接及作者。