結構體的大小不是結構體元素單純相加就行的,因為我們現在主流的計算機使用的都是32bit
字長的cpu,對這型別的cpu取4個
位元組的數要比取乙個位元組要高效,也更方便。所以在結構體中每個成員的首位址都是4的整數倍的話,取資料元素時就會相對更高效,這就是記憶體對齊的由來。每個特定平台上的
編譯器都有自己的預設「對齊係數」(也叫對齊模數)。程式設計師可以通過
預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一係數,其中的n就是你要指定的「對齊係數」。
規則:1、
資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照#pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。
2、結構(或聯合)的整體對齊規則:在
資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。
3、結合1、2可推斷:當#pragma pack的n值等於或超過所有資料成員長度的時候,這個n值的大小將不產生任何效果。
結構體的大小 記憶體對齊
includeusing namespace std struct t1 結果為8的倍數,因為最大成員型別double佔8位元組 16 struct t2 結果為2的倍數,因為最大成員型別short佔2位元組 4 struct t3 結果為8的倍數,因為最大成員型別double佔8位元組 16 st...
結構體大小及記憶體對齊
結構體大小 在計算結構體大小時,有幾點需要注意 1.char可存放在任意位址,short存放在能被2整除的位址,int存放在能被4整除的位址 即資料型別存放的位址要能被其資料型別所佔位元組數整除。可先將每個成員的位元組數寫出,然後從第二個成員開始,將前面成員的總位元組數補齊成當前位元組數的倍數。2....
結構體與記憶體對齊
三結構體 1.結構體是一種自定義型別 原生型別 自定義型別 2.結構體使用時先定義結構體型別再定義變數 或者同時定義 struct student struct student s1 struct student s1 typedef struct student s1 s1 s 3.結構體從陣列進...