分类: C/C++
2015-01-30 13:28:03
#pragma是编译器指示字,指示编译器完成特定动作,定义的指示字很多是编译器和操作系统特有的,#pragma在不同的编译器是不可移的:
1.预处理器将忽略它不认识的#pragma指令
2.两个不同的编译器可能以不同的方式解释同一条#pragma指令
用法:#pragma parameter
如1:#pragma message
message(vc特有,gcc将其忽略)参数在编译时输出信息到编译输出窗口中,可用于代码的版本控制。
如2:内存对齐#pragma pack (number)
Why内存对齐? cpu对内存的读取不是连续的,而是分块读取的,块的大小只能是1、2、4、8、16字节,当读取操作的数据未对齐则需两次总线
周期来访问内存,因此性能会大打折扣,某些硬件只能从规定的地址处取某些特定类型的数据,否则抛出硬件异常。
struct占用的内存大小:第一个成员始于0偏移处,每个成员按其类型大小和指定对齐参数中较小的一个进行对齐,结构体成员的对齐参数为其所
有成员使用的对齐参数的最大值,结构体总长度必须为所有对齐参数的整数倍。
#pragma pack(4):gcc默认的
字节 pack (4) 起始 大小 空了
2 4 Short 0 2
2
4 4 Long 4 4
----------------------------------------------------------------------------------8=2+2+4
1 4 char 0 1
3
4 4 struc s 4 8
8 4 double 12 8
-----------------------------------------------------------------------------------20=1+3+8+8