位元組對齊 記憶體對齊 對齊粒度

2021-06-27 14:11:38 字數 1467 閱讀 2958

其實標題裡面的三個關鍵字說的都是同乙個東西。也就是c++中類和結構體在記憶體中的分配策略,專業術語可以稱之為「對齊模數(alignment modules)」。

對齊模數分為三類:

1.自身對齊模數,也就是類或結構體中成員的大小,1,2,4,8之中的乙個,對應byte word dword qword。

2.指定對齊模數,也就是ide指定的預設對齊模,在ms系列ide中,預設為8。不過這個東西基本就是個擺設。

3.有效對齊模數,也就是自身對齊模數和指定對齊模數中較小的那乙個。

如何計算:

計算需要分為兩部分,都是用有效對齊模數來計算的,

1.類或結構體中成員的對齊模數

2.類或結構體整體的對齊模數

先來說下成員的對齊模數,

有效對齊模數,就是每個成員的大小。但是這些成員並不是連續排列的。每乙個成員的起始位址,必須要能被他的有效對齊模數整除。

舉個簡單的例子:struct這玩意的sizeof是8。

比如a的起始位址是0x00000000,那麼b的起始位址不是ptr+1,而是ptr+4。

因為b的有效對齊模數是4,從0x00000000開始第乙個能被4整除的位址是0x00000004,而b又佔4位元組。

所以,整個結構體所占用的空間是0x0000000~0x00000007 這八個位元組。

接下來說整體對齊模數:

類或結構體整體的有效對齊模數,就是其中最大那個成員的大小。

用乙個類似的例子:strict這玩意的sizeof還是8。

比如a的起始位址是0x00000000,那麼b的起始位址是0x0000004(b的模數是1,這個位址可以被整除)。

那麼這個結構體的大小應該為5。但是考慮到整體的對齊模數是4(最大的是int,大小為4)。

所以b雖然只占用了乙個位元組,但是後面還有3個位元組沒有用到,但是依然被系統視為結構體內的位址。

下面舉幾個比較複雜的例子

struct{

bytex1;

wordx2;

ulongx3;

bytex4;

sizeof==12

mem:

x1-0x00000000

x2-0x00000002

x3-0x00000004

x4-0x00000007

0x00000008-0x0000000b是在計算整體對齊粒度時候被加進來的

struct{

intx1;

doublex2;

bytex3;

sizeof==24

mem:

x1-0x00000000

x2-0x00000008

x3-0x000000a0

0x0000000a1-0x0000000a7是計算整體對齊粒度時候被加進來的

struct{

bytex1;

wordx2;

bytex3;

sizeof==6

mem:略~~~

C語言 位元組對齊(記憶體對齊)

1 平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料,某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常 2 硬體原因 經過記憶體對齊之後,cpu的記憶體訪問速度大大提公升。1.對齊原則 原則1 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,...

記憶體位元組對齊

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

記憶體位元組對齊

之前對記憶體位元組序知道一些,但是一直沒有系統的學習過,導致有時候還是說不清楚的,今天在網上查到一些自己,學習了下,並驗證了,特意給大家分享下,希望對大家能有幫助 總的來說就三條原則 在沒有 pragma pack巨集的時候 1 資料成員對齊規則,在結構體 struct 中,第乙個資料成員從0開始,...