一、結構體大小的計算
硬件裏的寄存器讀取數據的整數倍,有個內存對齊的規則
struct A
{
int a;
int b;
};//8
struct B
{
char a;//1+3
int b;//4
};
struct C
{
char a;//1+1
short b;//2
int c;//4
};
struct D
{
char a;//1+3
int b;//4
short c;//2+6
double d;//8
};//24
struct E
{
char a;//1+1
short b;//2
int c;//4
double d;//8
};//16
E比D排兵佈陣好(其實不一定,在一個平臺可以這麼說)
不同平臺內存對齊規則不統一
規則1:將前面的加起來看是否是後面的整數倍(這個說法不準確,應該可以說將前一個加起來看是否是後一個的倍數,湊夠最大字節的類型的倍數)
工作中:
struct F1
{
char a;
char x; //不使用,保留
short c;
int b;
double d;
};
struct F
{
int a;//4 最大單個整型
char b;//1
};//5+3,防止定義數組
結果不是5而是sizeof(F)=8 因爲5不是4的倍數,所以加3
規則2:看所有字節加起來是不是最大單個類型的倍數
struct G
{
char a;//1+3
int b;//4
short c;//2
};//10+2
struct I
{
int a;
struct II
{
float b;
int c;
}d;//double d
int *p;
short e;
};//20
int main()
{
printf("%d\n",sizeof(struct I));
struct F sa;
struct F arr[2];//sizeof(arr) == 10
return 0;
}
二、位段
位段的聲明和任何普通的結構成員聲明相同,但有兩個例外。首先,位段成員必須聲明爲int、signed int或unsigned int類型。其次,在成員名的後面是一個冒號和一個整數,這個整數指定該位段所佔用的位的數目。
位段可以很方便的訪問單一值。
三、聯合
聯合的所有成員引用的是內存中的相同位置。當你想在不同的時刻把不同的東西存儲於同一個位置時,就可以使用聯合。
四、結構體遇到段位怎麼算大小?
1.struct B
{
int a:9;
int b:11;
int c:12;
}
計算方法:(9+11+12)/8=4 再看4是不是sizeof(int)的倍數,若不是,則補齊
2.struct B
{
int a:9;
int b:11;
}
計算方法:(9+11)/8=3 3不是sizeof(int)的倍數,那麼+1 得4
五、聯合體怎麼計算大小?
union D
{
char a;
int b;
}
計算方法:單個成員佔用最大的那個,結果:4