結構體與內存對齊

三結構體
1.結構體是一種自定義類型
原生類型 自定義類型
2.結構體使用時先定義結構體類型再定義變量
或者同時定義
struct student{};struct student s1;
struct student{} s1;
typedef struct student{} s1; s1 s;
3.結構體從數組進步而來
數組有兩個明顯的缺陷:固定長度 類型相同
4.結構體訪問方式
使用->或者 . C語言規定用結構體變量訪問使用 . 點號 使用結構體指針使用->訪問
訪問實質還是使用指針來訪問


結構體對齊訪問
爲什麼要對齊訪問 :主要是爲了配合硬件 硬件本身存在物理限制
如果內存按照4個字節讀取讀取效率最高
對齊訪問用空間換時間




整個結構體整體的大小必須是8的倍數 
結構題每個元素都必須滿足自己自身的對齊
在滿足上面兩條條件按內存最小對齊
對齊位置有前後兩個元素共同影響 前一個元素影響開始地址 後一個元素影響結束地址
如struct s{
int a;
char b;
short c;
};
a的起始位置爲4的倍數,且停止位置爲4的倍數,則b可以直接按a的停止位置爲起始位置,結束位置受c影響,c佔2個自己,則c的起始位置要是2的倍數,則b需要一個位來對齊,則b佔兩個字節,此時c的起始位置爲b的結束位置+一位補充,結束位置需要按照結構體整體爲4的倍數


內存對齊指令#pragma pack()#pragma pack(n) (n=1/2/4/8)
32位編譯器,默認對齊方式爲4字節對齊
#pragma用來設置編碼器的對齊方式
#pragma pack() 設置編譯器1字節對齊 
#pragma pack(n) (n=1/2/4/8)設置編譯器n字節對齊
以#pragma pack(n)開頭以#pragma pack() 結尾 在這兩語句中間的以n字節對齊


struct s{
int a;
char b;
short c;
}__attribute__((packet)); __attribute__((packet)) 設置編譯器1字節對齊 


struct s{
int a;
char b;
short c;
}__attribute__((aligned(n))); __attribute__((aligned(n))) 讓結構體整體按n對齊 不是各個元素按n對齊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章