C中記憶體對齊問題

2021-05-23 15:47:45 字數 669 閱讀 5099

1、對於基本資料型別

許多計算機系統對基本資料型別可允許位址作了一定的限制,要求某種型別物件的位址必須是某個值n(通常是2、4、8)的倍數,從而來簡化處理器和儲存器之間的介面的硬體設計。如linux的對齊策略是2位元組資料型別,例如short的位址必須是2的倍數。而較大的資料型別如:int、int*、float、double則必須是4的倍數。而microsoft windows的策略要求更為嚴格-----任何k位元組物件的位址必須是k的倍數。比如要求乙個double型別物件的位址必須是8的倍數(引自《深入理解計算機系統》)。

2、資料結構

資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。編譯器的對齊係數可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變。

微軟編譯器的對齊規則:

1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

2) 結構體每個成員相對於結構體首位址的偏移量(offset)都是成員大小和通過上述命令指定的n值中較小的乙個的整數倍,如有需要編譯器會在成員之間加上填充位元組;

3) 結構體的總大小為結構體最寬基本型別成員大小和n中較小的乙個的整數倍,如有需要,編譯器會在最末乙個成員之後加上填充位元組。

linux下gcc的對齊規則:

對齊係數預設為4。上述三條規則都需做相應改變。

3、含有域位的

未研究

C 記憶體對齊問題

最近在開發客戶端網路連線過程遇到乙個非常奇怪的問題,這個問題卡了兩天多時間,百般嘗試,一籌莫展!一度讓我懷疑人生了 最後突然想到最近使用 pragma pack,設定記憶體對齊。當我取消這個 後,一切都正常了!事件起因與網路資料協議的定義 struct taginfo word為兩個位元組,byte...

C 記憶體對齊問題

c和c 不同 在c中struct class不占有記憶體,c 中,struct class通常占有1byte,原因是編譯器強 行在裡面放了乙個char,這樣可使這個class的不同例項化在記憶體中分配到獨一無二的位址 1 最基本的記憶體對齊情況 首先確定最大型別的大小 按照結構體中型別宣告順序來分配...

C 中記憶體對齊

在我們的程式中,資料結構還有變數等等都需要占有記憶體,在很多系統中,它都要求記憶體分配的時候要對齊,這樣做的好處就是可以提高訪問記憶體的速度。我們還是先來看一段簡單的程式 程式一 1 include iostream 2using namespace std 34 structx15 1011str...