#pragma与字节对齐

一,是一个编译器指示字,用于指示编译器完成特定的动做
用法:#pragma parameter
1,单纯的消息输出,用于编译的时候打印信息
#if defined(ANDROID20)
#pragma message("Compile Android SDK 2.0...")
#define VERSION "Android 2.0"
#elif defined(ANDROID23)
#pragma message("Compile Android SDK 2.3...")
#define VERSION "Android 2.3"
#elif defined(ANDROID40)
#pragma message("Compile Android SDK 4.0...")
#define VERSION "Android 4.0"
#else
#error Compile Version is not provided!
#endif
2,内存字节对齐,CPU访问内存为了提升速度通常只读2^n的地址,大多数编译器按照四字节对齐,CPU读取的时候,会选择字节对齐数读取(有可能一次读多个数字)。

#include <stdio.h>
#pragma pack(8)
struct S1{
short a;
long b;
};
struct S2{
char c;
struct S1 d;
double e;
};
#pragma pack()
分析:8字节对齐,第一个结构体一共只占了2+4字节,因此对齐后长度8字节。第二个结构体,1 + 4 + 4 +8 字节,因此是4+4+4(+4)+8,为何有个额外的+4是由于double的地址须要是8的整数倍这样CPU才能一次性去读8字节

struct A {  
int a;  
char b;  
short c;  
};  
struct B {  
char b;  
 int a;  
short c;  
};  
编译器默认四字节对齐,那么结构体A:4+1+2,最后对齐为4+1(+1)+2=8,结构体B,1+4+2,最后对齐为1(+3)+4+2(+2),+3是由于int的地址须要是4的倍数,+2是由于一次性须要读4个字节