关于struct和union存储的内存字节对齐的问题
原帖:http://blog.csdn.net/jcwKyl/archive/2008/04/21/2311112.aspx(我做了部分摘录)
1.可以使用 #pragma pack 指令来指定对齐字节,该指令指定内存对齐字节的功能和编译器选项 /Zp 是等效的。
2.#pragma指令对该指令之后的 struct 或 union 的声明有效。如果把这条指令放在介于数据结构的声明后面和这些数据结构的实例的定义前面,则不起任何效果。
3.在使用了 #pragma pack(n) 指定了内存对齐字节数后,struct 中除第一个成员外的每一个成员都会进行内存对齐,对齐的字节数是该成员本身类型所占的字节数和 #pragma pack(n) 中指定的对齐字节数中较小的那一个。一个 struct 本身所占的字节数是它的成员中需要对齐字节数的最大值和#pragma pack(n) 中指定的对齐字节数中较小的那一个的整数倍
4.就是 #pragma pack 指令的一般语法形式为:#pragma pack( [ [ { push | pop}, ] [ identifier, ] [ n ] ).push表示把当前程序中的对齐字节数压入到编译器栈中,pop表示弹出编译器栈中的对齐字节数并把它做为当前程序的对齐字节数。至于 identifier 的用法就是为了更好地以更容易理解的形式保存和恢复,MSDN中有详细的说明和示例。
例1:
#pragma pack(8)
struct Test1
{
char x1;
short x2;
double x3;
char x4;
};
struct Test2
{
char x1;
short x2;
float x3;
char x4;
char x5;
};
sizeof(Test1) = 1 + (1) + 2 + (4)+ 8 + 1 + (7) = 24
sizeof(Test2) = 1 + (1) + 2 + 4 + 1 + 1 + (2) = 12
例2:
#pragma pack(8)
struct example1
{
short a;
long b;
};
struct example2
{
char c;
example1 e;
short s;
};
sizeof(example1) = 2 + 4 + (2) = 8
sizeof(example2) = 1 + (3) + 8 + 2 + (2) = 16
只要明白了前几个的对齐规则,就很容易做了