鱼C论坛

 找回密码
 立即注册
查看: 2247|回复: 10

结构体字节对齐

[复制链接]
发表于 2015-9-22 08:57:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#pragma pack (2) /*指定按2字节对齐*/
struct C
{
     char b;
     int a;
     short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/sizeof(struct C)值是8。

修改对齐值为1:

#pragma pack (1) /*指定按1字节对齐*/
struct D
{
     char b;
     int a;
     short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
sizeof(struct D)值为7。

怎么理解这个?从内存角度分析?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-22 10:48:45 | 显示全部楼层
我的理解:
第一个你指定的是按两个字节对齐
char b  ;本来是一个字节,你指定了是按照2字节所以这里就是2字节
int a   ;本来是4字节,因为是按2对齐,所以依然是4字节
short c;本来是2字节,因为按2字节对齐,所以依然是2字节
结构体就为8字节

第二个,你指定按1个字节对齐,相当于是是多大就按多大来对齐
char b; 1字节
int a ;4字节
short c;2字节  
结构体就为7字节

题外话
当你没有指定的时候,他会按照最大的一个来对齐,所以如果你没有指定的时候会出现以下的情况
char b ;按int型对齐 ,占4字节
int a ;占4字节
short ;按int型对齐,占4字节

当你改变以下他们的顺序,这个时候依然是int型占的最大,所以按int型对齐,但是有点不一样的是,这里不再是char b占4个字节,short c 占4个字节了,而是char b +short c一起在4个字节,所以这里的结构体会是8个字节
char b ;   
short c ;
int a ;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2015-9-22 11:12:32 | 显示全部楼层
康小泡 发表于 2015-9-22 10:48
我的理解:
第一个你指定的是按两个字节对齐
char b  ;本来是一个字节,你指定了是按照2字节所以这里就是 ...

我看了如果没有指定按多少字节对齐 好像和字节偏移量有关?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-22 11:13:45 | 显示全部楼层
康小泡 发表于 2015-9-22 10:48
我的理解:
第一个你指定的是按两个字节对齐
char b  ;本来是一个字节,你指定了是按照2字节所以这里就是 ...

为什么你却没提到呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-22 13:48:37 | 显示全部楼层
康小泡 发表于 2015-9-22 10:48
我的理解:
第一个你指定的是按两个字节对齐
char b  ;本来是一个字节,你指定了是按照2字节所以这里就是 ...

题外话
当你没有指定的时候,他会按照最大的一个来对齐,所以如果你没有指定的时候会出现以下的情况
char b ;按int型对齐 ,占4字节
int a ;占4字节
short ;按int型对齐,占4字节

当你改变以下他们的顺序,这个时候依然是int型占的最大,所以按int型对齐,但是有点不一样的是,这里不再是char b占4个字节,short c 占4个字节了,而是char b +short c一起在4个字节,所以这里的结构体会是8个字节
char b ;   
short c ;
int a ;


你的这种算法好像和其他资料不一样?????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-22 14:28:33 | 显示全部楼层
wwwheihei 发表于 2015-9-22 11:12
我看了如果没有指定按多少字节对齐 好像和字节偏移量有关?

是和结构体中所占字节最大的一个变量类型有关
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-22 14:30:12 | 显示全部楼层
wwwheihei 发表于 2015-9-22 13:48
题外话
当你没有指定的时候,他会按照最大的一个来对齐,所以如果你没有指定的时候会出现以下的情况
ch ...


自己测试吧,我只是说了我自己了解到的东西。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-22 14:55:45 | 显示全部楼层
康小泡 发表于 2015-9-22 14:30
自己测试吧,我只是说了我自己了解到的东西。

其实,这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vc6.0,32位系统)。

类型

对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)

Char

偏移量必须为sizeof(char)即1的倍数

int

偏移量必须为sizeof(int)即4的倍数

float

偏移量必须为sizeof(float)即4的倍数

double

偏移量必须为sizeof(double)即8的倍数

Short

偏移量必须为sizeof(short)即2的倍数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-22 16:40:22 | 显示全部楼层
wwwheihei 发表于 2015-9-22 14:55
其实,这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处 ...

我知道这个。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-23 08:37:10 | 显示全部楼层

那我该如何把两种理解融汇贯通呢?还是两种说发不一样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-23 09:35:40 | 显示全部楼层
wwwheihei 发表于 2015-9-23 08:37
那我该如何把两种理解融汇贯通呢?还是两种说发不一样?

你说的这个,就是一个数据类型所占的大小,也就是我前面说过的,int 占4个字节,char占一个字节,这个是根据编译器来定的,不同的编译器他的大小是不一样的。你可以自己写代码测试一下,一个Int型所占的字节大小。然后对齐的那个是另外一知识点,在没有指定按照多少字节对齐的情况下,他是根据你这个结构体里面的所占字节最大的一个数据类型来对齐。 如果事先定义了,就会按照定义了的来对齐。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 10:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表