字節對齊
字節對齊
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;
}
最後更新:2017-04-03 12:55:57