記憶體位元組對齊

2021-06-05 19:20:27 字數 661 閱讀 2179

之前對記憶體位元組序知道一些,但是一直沒有系統的學習過,導致有時候還是說不清楚的,今天在網上查到一些自己,學習了下,並驗證了,特意給大家分享下,希望對大家能有幫助;

總的來說就三條原則(在沒有#pragma pack巨集的時候):

1、資料成員對齊規則,在結構體(struct)中,第乙個資料成員從0開始,以後每個資料成員的儲存位置要從該資料成員大小的整數倍開始(如:int在32位機器上是4個位元組,則要從4的倍數開始存)

2、結構體做為資料成員,如果在乙個結構體中包含某些結構體資料成員,則結構體成員儲存的起始位址要從其內部最大元素大小的整數倍開始儲存(如:struct bb中有struct aa,aa中有char、int、double資料成員,則bb從8的整數倍開始儲存)

3、最後一條,結構體的總大小,也就是sizeof算出來的結果,必須是其內部最大資料成員的整數倍,不足的要補齊。

struct aa 

;struct bb 

;//位元組對齊 end

int main(int argc, char* argv)

結果:還有#pragma pack(n)這個巨集,這個巨集的作用就是來設定所有位元組是按n的整數倍

對齊的。

如果在前面加上#pragma pack(1),則是按照1的整數倍對齊,相當於沒有對齊

其結果就是所有成員加起來的大小:

記憶體位元組對齊

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

記憶體位元組對齊

在c語言面試和考試中經常會遇到記憶體位元組對齊的問題。今天就來對位元組對齊的知識進行小結一下。首先說說為什麼要對齊。為了提高效率,計算機從記憶體中取資料是按照乙個固定長度的。以32位機為例,它每次取32個位,也就是4個位元組 每位元組8個位,計算機基礎知識,別說不知道 位元組對齊有什麼好處?以int...

記憶體位元組對齊

結構體內存對其規則 1.第乙個成員在與結構體變數偏移量為0的位址處。2.其他成員變數要對齊到某個數字 對齊數 的整數倍的位址處。對齊數 編譯器預設的乙個對齊數 與 該成員大小的較小值。vs中預設的值為8 gcc中的預設值為4 3.結構體總大小為最大對齊數 每個成員變數除了第乙個成員都有乙個對齊數 的...