字节对齐
c++的字节对齐可以提高数据的存取效率。
1.默认情况
类中或结构体中各成员变量在存放的时候根据在结构中声明的顺序依次申请空间,其在结构体中相对于始址的偏移量必须为自身所占字节的整数倍,否则编译器会为上个成员变量追加内存分配。
类的嵌套定义、静态成员、函数等均不算进sizeof()里面。
同时VC为了确保结构体的大小为结构的字节边界数(即该结构体中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
2.#pragma pack(n)
VC 中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:1.如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式;
2.如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。
结构的总大小也遵循上述规则。
#include <iostream> //# pragma pack (4) using namespace std; class A{ int a;//4 short b;//2 int c;//2+4 char d;//1 };//4+2+6+1=13 结构体后续补上3,总的为16 class B{ int a;//4 short b;//2 char c;//1 int d;//1+4 };//4+2+1+5=12 结构体已对齐 //无论A还是B,pack 中的4 不小于任何一个成员变量的sizeof,故相当于没写 int main(int argc, char *argv[]) { cout<<sizeof(A)<<sizeof(B);//16 12 return 0; }
#include<iostream> //#pragma pack(2)//若采用2字节对齐,输出22 class A { int i;//4 union U { char buff[13]; int i; }u;//13 void foo() { } typedef char* (*f)(void*); enum{red, green, blue} color;//3+4 }a;//4+16+4=24 int main(){ std::cout<<sizeof(A);//输出24 return 0; }