一、記憶體對齊:
編譯器將程式(class ,struct,union)中的每個資料(成員變數)安排在適當的位置上。
許多編譯器對資料在記憶體中的存放順序是有限制的,他們要求這些資料的首位址必須是某個數的整數倍(通常為4/8)
class的大小是其成員變數的和,其成員函式是所有物件共享的,並不佔空間
二、為什麼要記憶體對齊?
1.平台原因
不是所有硬體平台都可以訪問任意位址上的任意資料,某些平台只能在某些位址處取一些特定的資料,否則會丟擲硬體異常
(編址並不是對所有的記憶體進行編址,所以有些記憶體不能訪問)
2.效能原因:
資料結構應該盡可能的在自然邊界對齊,原因是,為了訪問未對齊的記憶體處理器可能需要做倆次記憶體訪問,而對齊的記憶體只需要訪問一次,這樣就會提公升cpu的訪問速率。
記憶體對齊是以空間換時間的做法
三、記憶體對齊規則
1.第乙個成員在與結構體變數偏移量為0的位址處
2.其他成員變數對齊在對齊數的整數倍的位址處
//對齊數 = min(編譯器預設對齊數,該成員的大小)
vs預設對齊數 8
gcc預設對齊數4
3.結構體的總大小為最大對齊數的整數倍
4.結構體如果鑲套了結構體,鑲套結構體對齊到自己的最大對齊數的整數倍,結構體的總大小是所有最大對齊數的整數倍。
注:在設計結構體的時候,盡量讓佔空間小的成員集中在一起,這樣可以節省空間
三、位段
1. 什麼是位段
位段的宣告和結構體很相似,但是有倆個不同
1)位段的成員必須是int、unsigned int 、signed int、char(屬於整型家族)
2)位段的成員後面有乙個冒號和乙個數字(表示bit)
2.位段分配記憶體的方式
1)位段的空間是按照4(int)個位元組或1(char)個位元組來開的
2)位段涉及很多不確定因素,位段是不跨平台的,注重可移植性的程式應避免使用
1.當給位段賦值超過它所能表示的範圍就會被丟棄(a._a-> _a:3 ; 10->1010 ;輸出2(010))
2.int位段被當成有符號還是無符號數是不確定的(a._b ->_b:4 ; 12->1100; 輸出-4)
3.位段中的成員在記憶體是從左向右分配的,還是從右到左不確定
4.當乙個結構體包含倆個位段,第二個位段成員比較大,無法容納於第乙個,第乙個成員剩餘的位是利用還是丟棄,不確定
跟結構體相比,位段可以達到相同的效果,還可以更好的節省空間,就是存在跨平台的問題
記憶體對齊 記憶體對齊規則解釋 記憶體對齊原理
一 記憶體對齊的原因 我們都知道計算機是以位元組 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.指...