在提出这几个问题之前,首先应该了解什么是内存对齐?
接下来我们就提出几个问题?
- 如何设置编译器的默认对齐数?
- 如何计算结构体中某变量相对于首地址的偏移量?
解决第一个问题就需要用到指令 #pragma pack ;下面解释一下如何使用它。
1. #pragma pack
#pragma pack 作用:指定结构体、联合以及类成员的packing alignment;
#pragma pack 的语法:
#pragma pack( [show] | [push | pop] [, identifier], n )
#pragma pack( show )//显示当前packing aligment的字节数,以warning message的形式被显示
#pragma pack( push )//将当前指定的packing alignment数值进行压栈操作,这里的栈是the internal compiler stack,同时设置当前的packing alignment为n;如果n没有指定,则将当前的packing alignment数值压栈
#pragma pack( pop)//从internal compiler stack中删除最顶端的record;如果没有指定n,则当前栈顶record即为新的packing alignment数值;如果指定了n,则n将成为新的packing aligment数值;如果指定了identifier,则internal compiler stack中的record都将被pop直到identifier被找到,然后pop出identitier,同时设置packing alignment数值为当前栈顶的record;如果指定的identifier并不存在于internal compiler stack,则pop操作被忽略
#pragma pack( identifier )//当同push一起使用时,赋予当前被压入栈中的record一个名称;当同pop一起使用时,从internal compiler stack中pop出所有的record直到identifier被pop出,如果identifier没有被找到,则忽略pop操作
#pragma pack( n )//指定packing的数值,以字节为单位;缺省数值是8,合法的数值分别是1、2、4、8、16