方法一:
結構體在記憶體中分配一塊連續的記憶體,但結構體內的變數並不一定是連續存放的,這涉及到記憶體對齊。
原則1資料成員對齊規則:結構(struct或聯合union)的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍位址開始儲存)。
原則2結構體作為成員:如果乙個結構裡有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍位址開始儲存。(struct a裡存有struct b,b裡有char,int,double等元素,那b應該從8的整數倍開始儲存。)
原則3收尾工作:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補齊。
方法二:
struct的記憶體大小為每個資料記憶體的加和,首先按照最大的資料型別進行單個分配,如果前乙個資料占用不了所有的記憶體,而剩下的記憶體可以放下下乙個資料,則第二個資料不另外分配記憶體(但是位址必須是從這個資料型別大小的整數倍開始,看下面的struct c),否則重新分配乙個最大型別的記憶體。
例題,即指標佔64位,8個位元組。
所以,*p所佔的記憶體是這要的:
a【0-7】:本身佔1個位元組,因原則1,d起始位置需要是8的倍數,於是位元組對齊佔7個位元組,共8個位元組
d【8-15】:64位指標,佔8位元組
b【16-19】:佔32位,4個位元組
c:16 【20-23】:佔16位,2個位元組,因原則1,e起始位置需要是8的倍數,於是位元組對齊佔2個位元組,共4個位元組
e【24-32】:64位,8個位元組
8 + 8 + 4 + 4 + 8 = 32
C語言結構體 位元組對齊
目的 犧牲一點空間,換時間的效率 cpu執行效率 最終結構體大小一定是4的倍數 32bit系統 結構體裡成員變數順序不一致,也會影響結構體的大小 資料型別 32位機大小 位元組 64位機大小 位元組 char11 short22 int4 4long48 指標型別48 double88 float4...
結構體位元組對齊問題
結構體 struct 的sizeof值,並不是簡單的將其中各元素所佔位元組相加,而是要考慮到儲存空間的位元組對齊問題。先看下面定義的兩個結構體.struct s1 struct s2 分別用程式測試得出sizeof s1 6 sizeof s2 4 可見,雖然兩個結構體所含的元素相同,但因為其中存放...
C語言結構體的位元組對齊
在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int long float等 的變數,也可以是一些復合資料型別 如陣列 結構 聯合等 的資料單元。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存,第...