C++内存对齐之结构体大小计算方式

计算机取数据是固定长度,可以提高效率。C++中的变量存放遵循对齐原则。

什么叫字节对齐?

假如一个char类型变量按四字节对齐方式储存,那它就存储在一个四字节单元中,仅占据首字节地址,其它字节空闲。再存储下一个数据变量时,不会占用上个单元的空闲字节,只会开辟一个新的四字节单元。字节对齐数一般都是2的倍数。

结构体大小的计算方法

整体对齐:以结构体内最大基本数据类型的字节数为模板,成员按顺序填充。

局部对齐:填充时按前面已存储的最大数据类型字节进行对齐。

结尾补齐:补齐最大字节单元。


struct Node {
	char c;
	int h;
	double s;
	void* p;
	char str[10];
}

该结构体的最大基本数据类型为double(8字节),所以以8字节为模板,结构体数据按顺序存储,首先为一个字节的char,再填充int的时候就为四字节对齐,两个数据变量共占8字节,依次类推,在最后不足8字节补齐。

所以该结构体的大小为32字节。

不同类型数据定义顺序不一样,也会导致结构体大小发生改变。将double和int的定义顺序交换,结构体大小就变成40字节,因为按默认的对齐方式char c独占8字节,str占了16字节。

设置字节对齐

#pragma pack(2)
struct Node {
	char c;
	
	int h;
	double s;
	int* p;
	char str[10];
};

结构体大小为28字节,#pragma pack(2)对齐以2字节为模板。#pragma pack()则是系统默认方式对齐。

如有错误,欢迎大佬指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值