當前位置:成語大全網 - 書法字典 - IOS結構內存分配

IOS結構內存分配

CGPoint是OC中的壹個結構,該結構壹般通過內存對齊來分配。

1.結構的每個成員相對於結構第壹個地址的偏移量是該成員大小的整數倍。如有必要,編譯器將在成員之間添加填充字節。

2.結構的總大小是結構最寬成員大小的整數倍。

3.結構變量的第壹個地址可以被其最寬的基本類型成員的大小整除。

4.對於在其結構成員屬性中具有結構變量的復合結構,在確定最寬的基本類型成員時,應該包括復合類型成員的子成員。但是,在確定復合類型成員的偏移位置時,復合類型被視為壹個整體。

5.總結:結構的大小等於最後壹個成員的偏移量加上其大小再加上末尾的填充字節數,即:sizeof(struct)= offset of(最後壹項)+sizeof(最後壹項)+sizeof(尾部填充)。

示例1:

第1個成員距結構第壹個地址的偏移量為0,它是成員int i(長度為4)的整數倍。

結構的第二個成員距第壹個地址的偏移量為4,它是成員char c(長度為1)的整數倍。(因為該結構的總大小是該結構最寬成員大小的整數位,如果該結構只有這兩個成員,則在char c之後將添加三個填充字節,但現在有三個成員,因此不需要填充。)

第三個成員相對於結構的第壹個地址的偏移量是5,它不是成員int x的整數倍,因此在x之前(或c之後)填充三個字節,以使x的偏移量達到8,成為4的整數倍。所以這個結構的內存大小是4+1+3+4。

示例2:每個成員類型的成員數量相同,但順序不同,內存大小也不同。

示例3:復合結構

# pragma pack(n)//編譯器將按鈕與n個字節對齊,並設置結構的最寬成員大小(小於實際最寬成員大小的值)。也就是說,結構的最終長度是n的整數倍。

# pragma pack()//取消自定義對齊。

# pragma pack(puch,1)//保存原始對齊方式並設置新的對齊方式。

# pragma pack(pop)//恢復先前保存的對齊狀態。

#pragma pack參數應為“1”、“2”、“4”、“8”或“16”

預期的#pragma pack參數為“1”、“2”、“4”、“8”或“16”。

演示

設置對齊後的內存計算

1.當設置的對齊長度小於當前成員長度時,成員偏移是成員長度的整數倍。

2.當設置的對齊長度大於當前成員長度且小於最長成員長度時,成員偏移是設置的對齊長度的整數倍。

3.當設定的對齊長度大於最長成員長度時,將根據當前成員的實際大小對齊成員偏移。

4.當設定的對齊長度小於實際的最長構件長度時,結構的長度是設定的對齊長度的整數倍。

5.當設定的對齊長度大於或等於實際最長構件長度時,結構的長度是實際最長構件長度的整數倍。