結構體內存對齊問題(附案例解析)c語言

2021-08-16 21:15:31 字數 1429 閱讀 1858

平台原因(移植原因)

不是所有的硬體平台都能訪問任意位址上的任意資料

效能原因

為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需一次訪問

總體來說就是: 結構體的記憶體對齊是拿空間換取時間的做法
結構體對其規則:
第乙個資料成員放在偏移量為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍位址開始儲存)。

結構體總大小為最大對齊數(每個成員變數除了第乙個成員都有乙個對齊數)的整數倍

如果巢狀了結構體,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所以最大對齊數(含巢狀結構體的對齊數)的整數倍

以下**均為vs編輯器下測試

測試1:

#include

struct s1

;

int main()

sizeof(struct s1)=12

char c1 1個位元組, int i 4個位元組 , char c2 1個位元組。

根據規則 1 ,2 . 補齊後 4+4+4=12

測試2:

#include

struct s2

;

int main()

sizeof(struct s2)=8

char c1 1個位元組, char c2 1個位元組, int i 4個位元組 ,

根據規則 1 ,2 . 補齊後 (1+1)+2+4=8

測試3:

結構體巢狀型別

#include

struct s3

;struct s4

;int main()

sizeof(struct s3)=16

double d 8個位元組,char c 1個位元組, int i 4個位元組 ,

根據規則 1 ,2 . 補齊後 8+(1+4+3)=16

sizeof(struct s4)=32

char c1 1個位元組 ,struct s3 s3 16個位元組,double d 8個位元組

根據 規則1,2,3 補齊後 (1+7+8)+16=32

結構體內存對齊問題

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

結構體內存對齊問題

今天參加的c c 筆試,總的來說,感覺已經比以前好多了,相信是每天及時總結的緣故,廢話不多說,下面繼續堅持。今天大致做了三塊內容,首先計算機網路通訊,然後是資料結構部分,最後才是c c 的題目。前兩者另外再做小結,先就c c 1 記憶體對齊問題 對這個問題,以前我也總結過,一段時間沒有回看盡然有點忘...

結構體內存對齊問題

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