C語言練習 2 記憶體對齊

2021-10-09 23:22:26 字數 1139 閱讀 3612

預設情況下,編譯器預設將結構體、棧中的成員資料進行記憶體對齊。

編譯器將未對齊的成員向後移,將每乙個都成員對齊到自然邊界上,從而也導致了整個結構的尺寸變大。

我們經常會接觸到結構體,合理的設定結構體成員能做到節約記憶體的目的。

例子1:

#include

struct test1

;struct test2

;int

main()

位元組對齊規則:位元組對齊的規則是結構的長度必須為所用過的所有對齊引數的整數倍,不夠就補空。

位元組。test1的記憶體布局:

所以最後記憶體按照4個位元組對齊

test2的記憶體布局:

所以最後記憶體按照4個位元組對齊

test2的1、2、3剛好湊夠4個位元組,按4位元組對齊的話剛好是8位元組。

看乙個綜合的例子:

#include

union package

;struct message

;int

main()

通過分析可以知道記憶體從第二個成員開始按照4位元組對齊,最後按照8個位元組對齊。注意:聯合體(union)是按照聯合體記憶體最大的那個成員來儲存的。

本例子中聯合體內最大為int,所以該聯合體佔4個位元組。

所以記憶體布局為:

id為char佔乙個位元組,crc為int佔四個位元組,現在已經佔了5個位元組了,放不下下乙個位元組了,記憶體對齊;union聯合體開始第從第二個8位元組位址儲存;long long佔8個位元組,從第三個8位元組位址儲存。所以佔了24個位元組。

c語言記憶體對齊(2)

vc對結構的儲存的特殊處理確實提高cpu儲存變數的速度,但是有時候也帶來了一些麻煩,我們可以遮蔽掉變數預設的對齊方式,自己設定變數的對齊方式。vc 中提供了 pragma pack n 來設定變數以n位元組對齊方式。n位元組對齊就是說變數存放的起始位址的偏移量有兩種情況 第 一 如果n大於等於該變數...

C語言記憶體對齊詳解(2)

vc對結構的儲存的特殊處理確實提高cpu儲存變數的速度,但是有時候也帶來了一些麻煩,我們也遮蔽掉變數預設的對齊方式,自己可以設定變數的對齊方式。vc 中提供了 pragma pack n 來設定變數以n位元組對齊方式。n位元組對齊就是說變數存放的起始位址的偏移量有兩種情況 第一 如果n大於等於該變數...

C語言記憶體對齊詳解(2)

vc對結構的儲存的特殊處理確實提高cpu儲存變數的速度,但是有時候也帶來了一些麻煩,我們也遮蔽掉變數預設的對齊方式,自己可以設定變數的對齊方式。vc 中提供了 pragma pack n 來設定變數以n位元組對齊方式。n位元組對齊就是說變數存放的起始位址的偏移量有兩種情況 第一 如果n大於等於該變數...