結構體內存對齊問題

2021-09-30 10:43:04 字數 714 閱讀 3093

今天參加的c/c++筆試,總的來說,感覺已經比以前好多了,相信是每天及時總結的緣故,廢話不多說,下面繼續堅持。

今天大致做了三塊內容,首先計算機網路通訊,然後是資料結構部分,最後才是c/c++的題目。

前兩者另外再做小結,先就c/c++。

(1)記憶體對齊問題:

對這個問題,以前我也總結過,一段時間沒有回看盡然有點忘了。想了想,今天沒有結合具體的編譯器說明,回答的不夠嚴謹是我最大的敗筆。

問題的引出:

struct f

使用sizeof(f)的答案是8個位元組而不是簡單的相加。

「記憶體對齊」的概念:許多實際的計算機系統對基本型別的資料在記憶體中存放位置有限制,常要求這些資料的首位址是某個數值的倍數,這就是所謂的記憶體對齊。

從效能上來說,在對齊的位址上訪問資料的速度快。位於32位的系統每次匯流排週期只能讀到4個位元組。

上面的乙個資料成員a與結構體的偏移量為0,總是存放在偏移量為0的位址上,其他成員對齊到某個數字(對齊數)的整數倍,該數字是預設對齊數和該成員的位元組數的較小值。結構體的總大小是最大對齊數的整數倍。

gnu g++對齊數只能取1,2,4,預設是4,其餘跟win平台一樣。

1 #include

2 struct a

3 ;9 

10 struct e

11 ;  

17 18 int main()

19  

列印結果為,6,8.

結構體內存對齊問題

問題描述 結構體內存對齊問題值直接的體現就是計算結構體的sizeof占用的位元組數。結構體內存對齊的幾個原則,有了這幾個原則,不管結構體裡面是什麼元素,我們都能夠正確算出sizeof值 以vs2013為例 原則2 在原則1的基礎上,檢查計算出的儲存單元是否為所有元素中最寬的元素的長度的整數倍,是,則...

結構體內存對齊問題

假設cpu要讀取乙個4位元組大小的資料到暫存器中 假設記憶體讀取粒度是4 分兩種情況討論 1.資料從0位元組開始 記憶體對齊 2.資料從1位元組開始 記憶體不對齊 當資料從1位元組開始的時候,問題很複雜,首先先將前4個位元組讀到暫存器,並再次讀在這裡插入 片了這麼多額外操作,大大降低了cpu 的效能...

結構體內存對齊

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