当前位置: 技术问答>linux和unix
g++结构对齐请教???
来源: 互联网 发布时间:2016-05-06
本文导语: 我想8字节对齐,用如下伪指令设置:#pragma pack(8),好像无效,还是4字节对齐。请到手指点一下,郁闷。源码入下: #pragma pack(8) struct AAA { char chX1; int nX2; float fX3; double dX4; char chX5; }; struct AAA aaa; #pragma...
我想8字节对齐,用如下伪指令设置:#pragma pack(8),好像无效,还是4字节对齐。请到手指点一下,郁闷。源码入下:
#pragma pack(8)
struct AAA
{
char chX1;
int nX2;
float fX3;
double dX4;
char chX5;
};
struct AAA aaa;
#pragma pack()
结构大小还是24.如果是8字节对齐,应该是32啊。
#pragma pack(8)
struct AAA
{
char chX1;
int nX2;
float fX3;
double dX4;
char chX5;
};
struct AAA aaa;
#pragma pack()
结构大小还是24.如果是8字节对齐,应该是32啊。
|
1楼说的基本上正确,但是对于数据成员超过CPU字长的数据成员来说,各个编译器有自己的做法。例如
struct A
{
char a;
double b;
};
在VC上按照1楼说的sizeof为16,但是在gcc上double却按照4个字节对齐,也就是说尽管#pragma pack(8),double仍然从偏移4开始,sizeof为12,我不懂这里的原因,可能是因为CPU字长为32位,double按照4字节和8字节对齐没有任何区别吧
struct A
{
char a;
double b;
};
在VC上按照1楼说的sizeof为16,但是在gcc上double却按照4个字节对齐,也就是说尽管#pragma pack(8),double仍然从偏移4开始,sizeof为12,我不懂这里的原因,可能是因为CPU字长为32位,double按照4字节和8字节对齐没有任何区别吧
|
struct AAA
{
char chX1; // min{1, 8} = 1, 存放在 000000 字节
int nX2; // min{4, 8} = 4, 存放在 000004 -- 000007 字节
float fX3; // min{4, 8} = 8, 存放在 000008 -- 000011 字节
double dX4; // min{8, 8} = 8, 存放在 000016 -- 000023 字节
char chX5; // min{1, 8} = 1, 存放在 000024 字节
};
struct AAA aaa;
// 参考 http://www.cadcaecam.com/forum/read.php?tid=10454
#pragma pack规定的对齐长度,实际使用的规则是:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。
{
char chX1; // min{1, 8} = 1, 存放在 000000 字节
int nX2; // min{4, 8} = 4, 存放在 000004 -- 000007 字节
float fX3; // min{4, 8} = 8, 存放在 000008 -- 000011 字节
double dX4; // min{8, 8} = 8, 存放在 000016 -- 000023 字节
char chX5; // min{1, 8} = 1, 存放在 000024 字节
};
struct AAA aaa;
// 参考 http://www.cadcaecam.com/forum/read.php?tid=10454
#pragma pack规定的对齐长度,实际使用的规则是:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。
|
linux下g++也是16呀