结构体字节对齐 pack linux,Linux下的字节对齐问题

看一下这段程序

#pragma pack(4)

struct TEST1

{

char a;

char b;

char c;

}

#pragma pack()

sizeof()结果为3,#pragma pack(4)为什么没起作用啊

然后又试了别的

#pragma pack(4)

struct TEST1

{

char a;

shortb;

char c;

}

#pragma pack() 结果为6

#pragma pack(4)

struct TEST1

{

char a;

double b;

char c;

}

#pragma pack() 结果为16

gcc下缺省的是4吗,#pragma pack(8)可以用吗,谁能帮我解释一下这到底是怎么回事,我已经晕了!

谢谢!

|

我试了一下

#pragma pack(x)

x在4及4以下字节对齐没问题

但是下x=8时是不起作用的

#pragma pack(8)

struct TEST1

{

char a;

double b;

char c;

double d;

char e;

};

结果为28

google了一下

Win32平台下的微软C编译器(cl.exe for 80x86)在默认情况下采用如下的对齐规则: 任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。Linux下的GCC奉行的是另外一套规则(在资料中查得,并未验证,如错误请指正):任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。

见http://dev.csdn.net/article/56/56202.shtm

|

怪哦,要不试试#pragma pack(push,4)和#pragma pack(pop)

|

编译器的编译选项加上 --pack-struct试试

|

好像linux下对char类型的变量,都是1字节对齐的,只有非char类型变量,才是4字节(or 倍数)对齐

|

__attribute__(packed)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值