c c 記憶體對齊總結

2021-08-07 14:13:33 字數 964 閱讀 3844

1、引言

對於結構體來經常會涉及到記憶體對齊問題,如下面**所示:

現在已經佔了9位元組的長度,但是實際上所佔長度為12,這為什麼呢?我們看記憶體對齊規則二。

規則二:

在struct或者union元素對齊後,struct或者union整體也要進行對齊操作,對齊將按照,#pragma pack和struct或者union中成員中最大資料成員中較小的那個進行;

則對於以上的例子來說,pragma pack為4,結構體中最大資料成員長度也為4,則結構提整體以4位對齊係數進行對齊,已經有9個位元組,則補3位元組為12位元組。所以整個結構體長度為12。

3、其他對場景舉例

* 場景一:

整體struct對齊係數為:pragma pack(1) 和 float中較小者為 1;

則整體結構體所佔長度為8.

*場景二:

現在所佔位元組為:9

整體struct對齊係數為:pragma pack(8) 和 float中較小者為 4;

則整體結構體所佔長度為12。

4、結尾

記憶體對齊對於c/c++程式設計師來說是必須要掌握的乙個點,也是各種面試和筆試中常考的點,至此將記憶體對齊做了乙個總結,以備後續查閱。

C C 記憶體對齊

一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...

C C 記憶體對齊

一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...

C C 記憶體對齊

一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...