IOS 記憶體對齊

2021-10-01 19:52:32 字數 1301 閱讀 9382

在計算機中,記憶體大小的基本單位是位元組,理論上來講,可以從任意位址訪問某種基本資料型別。

但是實際上,計算機並非按照位元組大小讀寫記憶體,而是以2、4、8的倍數的位元組塊來讀寫記憶體。因此,編譯器會對基本資料型別的合法位址作出一些限制,即它的位址必須是2、4、8的倍數。那麼就要求各種資料型別按照一定的規則在空間上排列,這就是對齊。

在ios開發過程中,編譯器會自動的進行位元組對齊的處理,並且在64位架構下,是以8位元組進行記憶體對齊的。

記憶體對齊應該是編譯器的管轄範圍,編譯器為程式中的每個資料單元安排在適當的位置上,方便計算機快速高效的進行讀取資料。

每個平台的編譯器都有自己的對齊係數和相應的對齊規則。在ios中的64位架構下,對齊係數就是8個位元組。

結構體或者共用體中的成員變數中,首個成員變數放在偏移量為0的位置上,後面的成員變數的對齊偏移量是取指定對齊係數和本身該成員變數所占用大小中的較小值,即min(對齊係數,成員變數的記憶體大小 )

在結構體或者共用體中的成員變數完成自身的對齊之後,整個結構體或者共用體也需要進行位元組對齊處理,一般為min(對齊係數,最大成員變數的記憶體大小 )的整數倍。

結合上述原則1、2,可以推斷出下面的常用原則,以結構體為例:

1.為了減少cpu訪問記憶體的次數,提高計算機效能,一些計算機硬體平台要求儲存在記憶體中的變數按自然邊界對齊。

效能上的提公升

從記憶體占用的角度講,對齊後比未對齊有些情況反而增加了記憶體分配的開支,是為了什麼呢?

資料結構(尤其是棧)應該盡可能地在自然邊界上對齊,為了訪問未對齊的記憶體,處理器(cpu)需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。最重要的是提高記憶體系統的效能。

跨平台有些硬體平台並不能訪問任意位址上的任意資料的,只能處理特定型別的資料,否則會導致硬體層級的錯誤。

有些cpu(如基於 alpha,ia-64,mips,和 superh 體系的)拒絕讀取未對齊資料。當乙個程式要求這些 cpu 讀取未對齊資料時,這時 cpu 會進入異常處理狀態並且通知程式不能繼續執行。

舉個例子,在 arm,mips,和 sh 硬體平台上,當作業系統被要求訪問乙個未對齊資料時會預設給應用程式丟擲硬體異常。所以,如果編譯器不進行記憶體對齊,那在很多平台的上的開發將難以進行。

在結構體中,宣告成員變數的順序不一致,也會導致最終分配記憶體大小的不同。

4.1 記憶體分配

4.2 跨平台通訊

在跨平台通訊的過程中,由於不同平台的對齊方式或者對齊係數可能不同,這樣就會導致同樣的資料結構在不同的平台其記憶體大小就可能存在不同。

在真正的開發過程中,我們不用過多關注位元組對齊的問題,編譯器會幫我們處理好。但是,我們能做的是,在設計資料結構時,合理安排成員變數的順序。具體總結如下:

記憶體對齊 記憶體對齊規則解釋 記憶體對齊原理

一 記憶體對齊的原因 我們都知道計算機是以位元組 byte 為單位劃分的,理論上來說cpu是可以訪問任一編號的位元組資料的,我們又知道cpu的定址其實是通過位址匯流排來訪問記憶體的,cpu又分為32位和64位,在32位的cpu一次可以處理4個位元組 byte 的資料,那麼cpu實際定址的步長就是4個...

記憶體對齊(自然對齊)

參考 今天與超,暉,棟,宇幾人論此問題,終得以下結論,不知正確與否,姑且記下。對於32位機,cpu的記憶體讀寫週期是4word,所以在記憶體對齊時,皆以此填滿。如 struct a char a double b char c sizeof a 4 8 4 16 struct b char a do...

位元組對齊 記憶體對齊 對齊粒度

其實標題裡面的三個關鍵字說的都是同乙個東西。也就是c 中類和結構體在記憶體中的分配策略,專業術語可以稱之為 對齊模數 alignment modules 對齊模數分為三類 1.自身對齊模數,也就是類或結構體中成員的大小,1,2,4,8之中的乙個,對應byte word dword qword。2.指...