在c/c++中,结构体的数据存储对齐是常见的一个问题。先看一下这个程序:
#include <iostream>
#pragma pack(8)
using namespace std;
int main()
{
struct A
{
char a;
int b;
short c;
};
cout << sizeof(A) << endl;
cout << sizeof(char) << endl;
cout << sizeof(int) << endl;
cout << sizeof(short) << endl;
cout << sizeof(float) << endl;
cout << sizeof(long) << endl;
cout << sizeof(double) << endl;
return 0;
}
|
从注意问题来看,应该有两个:
1)#pragma pack(8)
2)结构体的大小
对于第一个问题,基本的解答是:
· 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
#pragma pack规定的对齐长度,实际使用的规则是:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和结构体的自然对齐长度中比较小的那个进行。
也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
结构体的对齐,按照结构体中size最大的数据成员和#pragma pack指定值之间,较小的那个进行。
对于第二个问题,一般来讲,结构体中是按最大的成员对齐,里面char长度为1,int为4,short为2,则结果为4*3 = 12.
不过存在两个问题需要注意:
1).在vc和gcc中,因为兼容性问题,可能获取的结果是不一致的。
2).在gcc中:
struct A
{
char a;
int b;
double c;
};
中sizeof(A)的长度为16,因为double为8,如果算下来只能是第一个变量占4,第二个变量占4,第三个变量占8,但是还需要进一步考据。
阅读(747) | 评论(0) | 转发(0) |