一、記憶體對齊的原因
1、為了提高程式的效能,資料結構應該盡可能的在自然邊界上對齊。原因是為了訪問未對齊的記憶體,處理器需要進行兩次訪問而訪問對齊的記憶體只需要一次就夠了。這樣的方式稱為「用空間來換取時間」,在對時間複雜度有要求的問題會採用這樣的方法。
2、記憶體對齊可以增加程式的可移植性,因為不是所有的平台都能隨意的訪問記憶體。有些平台只能在特定的位址處取記憶體。
栗子:
#include
using
namespace
std;
struct x
s1; void main()
執行結果為:
這就是結構體內存對齊的乙個很典型的栗子
二、結構體內存對齊的概念
對齊原則:資料存放的起始位置是自身大小的整數倍處。
預設對齊數:在vs下記憶體預設對齊是8,linux是4。可以通過#program pack來修改預設對齊數。
偏移:相對與起始位置的位置。偏移的是資料型別的整數倍處。
對齊數:變數自身的大小和和預設對齊數的最小值。假設預設對齊數是8,int型別的對齊數是4,那麼就會取int型別的預設對齊數。
三、結構體內存對齊的規則
1、結構或聯合的資料成員,第乙個成員放到0偏移的地方,以後每個成員都放到自身對齊數的整數倍偏移處。
2、結構體的大小必須是最大對齊數的整數倍。
舉個栗子:
struct x
s2;
這個栗子是將上面那個栗子的double變數和int型的變數互換了一下位置,但是這個sizeof(s2)卻是24,這個就是第二原則的具體情況。我們分析的長度是8 + 8 +4 = 20。但是,結果卻是24。因為20不是8的整數倍,所以要把它增容到8的整數倍。
下個栗子
前面介紹的都是單一的結構體,但是如果結構體裡面巢狀乙個結構體會怎麼樣呢?那麼就看下乙個栗子吧。(今天栗子管夠,希望大家能吃好)
struct x
;struct y
;
經過測試,可知道sizeof(x)為16,sizeof(y)為24.即y的長度存放的第二個元素b時的初始位置是在double型的長度的8的整數倍處,而非16的整數倍處,即系統為b分配的儲存空間是8~23個位元組。
如果將y的兩個元素char型的a和x型的調換順序,則系統為b分配的儲存位置是0~15個字元,為a分配的是第16個字元。17不是double的整數倍,所以要是8的倍數。就是24。
總結:
結構體所佔的空間與其內部元素的型別有關,也與它們定義的順序也是有關的。但是,只要遵守結構體對齊的規則,這也是很簡單的。
結構體內存對齊
結構體內存對齊 一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這...
結構體內存對齊
一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...
結構體內存對齊
對齊規則 每個特定平台上的編譯器都有自己的預設 對齊係數 也叫對齊模數 程式設計師可以通過預編譯命令 pragma pack n n 1,2,4,8,16來改變這一係數,其中的n就是你要指定的 對齊係數 規則 1 資料成員對齊規則 結構 struct 的資料成員,第乙個資料成員放在offset為0的...