c语言数据结构的内存对齐


1、共用体(union)所占的字节数是最大的成员内存。


2、结构体(struct)类型占用的内存空间的计算方法:所有成员的内存的和,内存对齐是按偏移计算的。



在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。


结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding)




2.1、默认情况下,Linux操作系统是以4字节对齐,windows操作系统则是以最大的内置类型对齐。


2.2、32位系统:
4字节对齐
每行4个字节,字符数据按照一个一个的存储


2.3、64位系统:
根据最大变量的长度确定对齐的,如果最长数据为8字节,则8字节对齐,如果最长数据为4字节,则4字节对齐(按照最长类型的字节数对齐)




3、结构体中有2个以上的数据时,才考虑对齐问题,如果只有一个,这个类型长度是多少,结构体长度就是多少





4、更改C编译器的缺省字节对齐方式

在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。


4.1、一般地,可以通过下面的方法来改变缺省的对界条件:

     · 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
     · 使用伪指令#pragma pack (),取消自定义字节对齐方式。


4.2、还有如下的一种方式:

     · __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
     · __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。


4.3、以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。


4.4、#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值