近日在不少學生面試的過程中遇到了關於求結構體大小(以位元組為單位)等等相關問題,我也看過相當一部分資料,但大多數學生都不願意去看大篇幅的文章,在此我用一此簡單的例項和少量理論概述對結構体作乙個分析:
試驗用的編譯器為vc6.0的c編譯器,平台為windows xp
定義乙個結構體如下
struct test
記憶體位置:0 1 2 3 4 5 6 7
資料位置:a b
從上圖可以看出,a後面將會有3個位元組是空的,b 從第四個位元組開始儲存後面四個位元組剛好夠存乙個int資料型別。
接下來我們分析一下為什麼test的大小是8,而不是5或其它的。可以這樣直觀的理解乙個動態記憶體分配的情況,編譯器首先會在記憶體中給a分配乙個位元組去存放資料,接下來要去給b分配資料乙個int(即4個位元組)去儲存資料,那麼在這個時候,編譯器不會僅隨a的位址空間後面給b分配空間,實際會在a的後面空出3個位元組後,才是b的位址,因為結構體的大小要滿足乙個記憶體對齊的原則。
記憶體對齊,可以簡單理解為乙個對齊尺度,要是再簡單一點 記憶體對齊就是乙個整數(即記憶體對齊係數,它是記憶體對齊的實際體現),每個結構體都有記憶體對齊係數,這個係數我們可以指定,也可以系統預設(test即為系統預設記憶體對齊系統)。
記憶體對齊係數規律:記憶體對齊係數為 n ,結構體實際大小為size,則一定滿足size/n等於0.
根據這個規律,我們進一步分析test結構體大小,編譯器要為結構體中的a分配空間時,由於char只佔乙個位元組,結構體遵循1個位元組對齊,當要給b分配空間時,由於int佔四個位元組,此時結構體就變為遵循4個位元組對齊了,而結構體實際只用了5個位元組存放資料,但為了滿足記憶體對齊原規,因此在a後面空出了3個位元組。這樣結構體的大小實際為:1+3+4=8。
有問題的同學千萬不要想為什麼空出的位元組是在a後面,而不是在b後面空3個位元組,記住是在要給b分配空間時結構體要按4位元組對齊的,而最初給a分配空間是按1個位元組對齊,理所當然是要在a後面空3個位元組了。
struct test1
struct test2
test1和test2大小分別為多少,它們各自的記憶體分配情況又如何,具體對齊係數為多少?
本人才疏學淺,文中如有不足之處,請大家一起修改或留下寶貴意見!
老鳥可以略過。
c語言 sizeof 求結構體大小
運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof char 1 sizeof int 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。c語言中的構造資料型別有三種 陣列 結構體和共用體。陣列是相同型別的元素的集合,只要會計算單個元素的大小,整個陣列...
sizeof求結構體大小的問題
標籤 空格分隔 c c 具體見 補充 另外乙個涉及資料型別以及記憶體儲存的問題 記憶體中的資料並非儲存在任意位址。處理器通常按照和其字大小相同的塊讀取記憶體資料 那麼考慮到效率因素,編譯器會按照塊大小的整數倍對記憶體中的實體進行位址對齊。因此在 32 位的處理器上,乙個 4 位元組整型資料肯定存放在...
結構體大小
含有基本型別的結構體的大小所對應的最終決定因素是結構體內自身成員的分布。成員不同的分布將導致含有相同成員結構體大小的不同,每個成員的對齊都是以緊接著後面的乙個為參考的,如果緊接著的大於對應指定,就以緊接著的為對齊因子,否則將聯絡周圍的具體情況進行對齊,而且對齊因子只有三種型別 1,2,4。對於最後一...