說明:******不同的編譯器和處理器,其結構體內部的成員有不同的對齊方式。
******使用sizeof()運算子計算結構體的長度。
###結構體中每個成員相對於結構首位址的偏移量都是成員大小的整數倍,如果有需要編譯器會在成員之間加上填充字。
###結構體的總大小是結構體最寬基本型別成員大小的整數倍。如果需要編譯器會在最後乙個成員之後加上填充字。
struct a
aa;按結構體成員對齊,應該給c分配乙個位元組的空間,但是還得按結構體的對齊方式,所以給c分配4個位元組。sizeof(aa)==12
結構體成員對齊,應當按結構體中最大基本資料型別來分配儲存空間,例如:當乙個成員a分配的空間大於自己本身的大小時,若是下個成員b所需空間,a分配空間的剩下空間足以滿足儲存b的時候,那麼就不會給b分配了,但是,若不能滿足b的儲存的話,會給b按結構體最大資料型別來分配。
###計算結構體某個成員相對於結構體首位址的偏移量,通過巨集offsetof()可以獲得。
#define offsetof(type, member) ((size_t) &((type *)0)->member)//type:結構體的型別//member:結構體中某個成員/* *offsetof(,)巨集解析: *(type *)0:將0強制轉換成指向結構體首位址的指標(結構體首位址為0位址) *((type *)0)->member:結構體中某個變數 * &((type *)0)->member:取成員變數member(都是在0位址的基礎上增加的)的位址 * (size_t) &((type *)0)->member:將取到的位址強制轉換成size_t資料型別。 */
結構體變數的初始化:
結構體:
struct a
;第一種初始化方法:
struct a aa=;
第二種初始化方法:
struct a aa=;
第三種初始化方法:
struct a aa;
aa.b=2;
aa.a=1;
aa.c=3;
aa.d=4;
aa.e=5;
aa.f=6;
aa.g=7;
C語言結構體內存對齊
1.效能原因 為了提高cup的效率訪問記憶體的速度,若是訪問未對齊的記憶體,處理器需要作兩次訪問 而訪問對齊的記憶體,則只需要一次訪問。2.編譯器相關 有的編譯器已經優化了記憶體對齊,所以記憶體對齊依賴於編譯器。參考 結構體對齊問題 說實話,規則看起來不太好理解,直接模仿下面步驟即可 以32位機器為...
C語言結構體內存對齊
記憶體中存放資料的時候要有一定的規則,這麼做得根本原因是要減少cpu訪問記憶體的次數。舉個例子,int型別為4個位元組,存放int型別的記憶體的起始位址就是4的倍數,這樣cpu訪問一次記憶體就能夠取到資料 跟cpu訪問記憶體的機制有關,加上cache的對映,一般cpu一次訪問64位元組的資料,也有1...
C語言 結構體內存對齊
1 平台原因 不是所有硬體平台都能夠訪問任意位址上的任意資料的,某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。2 效能原因 主要原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問 而對齊的記憶體訪問僅需要一次訪問...