当前位置: 技术问答>linux和unix
Linux下的字节对齐问题
来源: 互联网 发布时间:2015-09-20
本文导语: 看一下这段程序 #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; cha...
看一下这段程序
#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(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(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)