位域结构体的字节对齐


使用位域的主要目的是压缩存储,其大致规则为:
 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空
间不够存放另一位域时,应从下一单元起存放该位域。
 如果相邻位域字段的类型相同,且其位宽之和小于类型的 sizeof 大小,则
后面的字段将紧邻前一个字段存储,直到不能容纳为止。
 如果相邻位域字段的类型相同,但其位宽之和大于类型的 sizeof 大小,则
后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍。
 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,vc6.0 采
取不压缩方式,Dev-C++和gcc 采取压缩方式。
 如果位域字段之间穿插着非位域字段,则不进行压缩。

例如:

 1 struct A 
 2 { 
 3     int a1 : 
 4     int a2 : 
 5     char b; 
 6     int c : 4
 7     short d; 
 8 }B;
 9 
10 a)48 或16字节对齐 
11 a1+a2: 4 * 0 = 0 
12 b:     4 * 1 = 4 
13 c:     4 * 2 = 8 
14 d:     2 * 6 = 12              sizeof(B) = 16 
15 
16  b) 2字节对齐 
17 a1+a2: 2 * 0 = 0 (int为4 字节, 大于对齐字节(2 字节),以2 字节计算) 
18 b:     1 * 4 = 4 
19 c:     2 * 3 = 6 (int 为4 字节, 大于对齐字节(2 字节),以2 字节计算) 
20 d:    2 * 5 = 10 
21 
22 c)1字节对齐 
23 a1+a2 = 14位,小于4 字节(int 类型为4 字节),所以,a1 和a2放在一起 
24 sizeof(B) = 4 + 1 + 4 + 2 = 11 

 

结构体字节对齐引起的访问越界问题通常出现在以下情况下: 1. 结构体中存在字节对齐的成员变量,访问该成员变量时,可能会访问到结构体之外的内存空间。例如,如果某个成员变量的长度是4字节,但该结构体字节对齐方式是8字节,那么访问该成员变量时,可能会访问到结构体之外的4字节内存空间,从而导致访问越界。 2. 结构体中存在数组类型的成员变量,访问该数组时,可能会访问到数组之外的内存空间。例如,如果一个数组的长度是10,但该结构体字节对齐方式是16字节,那么访问该数组时,可能会访问到数组之外的6字节内存空间,从而导致访问越界。 为了避免结构体字节对齐引起的访问越界问题,可以采取以下措施: 1. 使用编译器提供的或自定义的对齐方式,以确保结构体中成员变量的对齐方式符合要求。 2. 避免在结构体中使用数组类型的成员变量,或者使用动态内存分配等方法来管理数组,以确保数组访问不会越界。 3. 避免在结构体中使用位域类型的成员变量,或者使用位运算等方法来确保位域访问不会越界。 4. 在编写代码时,注意检查结构体中的成员变量访问是否越界,可以使用断言等方法来检查访问边界。 总之,结构体字节对齐引起的访问越界问题需要引起重视,需要在编写代码时注意结构体成员变量的对齐方式和访问边界,以确保程序的正确性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值