c 無法讀取記憶體 記憶體對齊原則

2021-10-11 06:23:09 字數 1749 閱讀 5616

好久沒寫了,怎麼樣才能每天堅持,對待linux得像對待自己的熱戀中人每晚休息前想到她才可以記得住做好筆錄呀!以後至少兩天更新乙個新的知識點!大家都很努力,生活的困境只能困住你的身體,你的精神還是自由的!

記憶體對齊原則:

1、以最大的成員大小來分配空間。若最大成員的大小大於最大預設分配單位,以預設分配單位大小為準;(32位系統 4位元組;64位系統 8位元組)

2、每個成員儲存的起始位置,一定是該成員大小的整數倍。

結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方

結構體:

struct stu:

struct stu ss;

char *c;在32位和64位作業系統中大小不同,

32位作業系統中,sizeof(ss)=12;

64位作業系統中,sizeof(ss)=16;

cpu是無法直接在硬碟上讀取資料的,而是通過記憶體讀取。cpu通過位址匯流排、資料匯流排、控制匯流排三條線堆記憶體中的資料進行傳輸和操作。

具體流程:

1、cpu通過位址匯流排,找到該資料

2、通過控制匯流排得知該操作是讀操作還是寫操作

3、通過資料匯流排將該資料讀取到cpu或者從cpu寫到記憶體中

所以,位址匯流排的寬度決定了cpu的定址能力;

資料匯流排的寬度決定了cpu單次資料傳輸的傳輸量,也就是傳輸速度;

控制匯流排決定了cpu對其他控制項的控制能力以及控制方式

我們平時所說的計算機是64位、32位、16位,指的是計算機cpu中通用暫存器一次性處理、傳輸、暫時儲存的資訊的最大長度。即cpu在單位時間內(同一時間)能處理的二進位制數的位數。

假如位址匯流排是64位的,那麼一次可以在2^64種可能中尋找乙個位址,位址空間為0x0000 0000 0000 0000~0xffff ffff ffff ffff,十進位制為0~2^64-1。

我們一般需要64個0或1的組成就可以找到記憶體的所有位址,而64個0或1的組合,就是64個位,也就是8位元組,因此,我們只需要8個位元組就可以找到所有的資料。所以在64位計算機中,指標佔8個位元組。同理在32位計算機中,指標佔4個位元組。

在64位系統中,cpu會通過位址匯流排在2^64個位址中尋找其中的某乙個位址的資料,8個位元組的指標可以代表記憶體中任意位置的乙個位址,所以指標佔8個位元組就足夠用了。

其他知識點:

資料儲存是以位元組(byte)為單位,資料傳輸大多是以位(bit)為單位,乙個位代表二進位制的乙個0或1,每8個位(bit)組成乙個位元組(byte),是最小一級的資訊單位。

計算機能夠處理的最小單元是位元組。這裡可以想一下大端序和小端序。

參考: 為什麼乙個指標在32位系統中佔4個位元組,在64位系統中佔8個位元組? - 高曉牛 - ​www.cnblogs.com

C 記憶體對齊原則

c 記憶體對齊原則 1 在沒有 pragam pack巨集的情況下,struct class union記憶體對齊原則有四個 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的位置,以後每個資料成員儲存的起始位置都是放在該資料成員大小的整數倍位...

c 記憶體對齊原則

struct class union記憶體對齊原則有四個 1 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小或者成員的子成員大小 只要該成員有子成員,比如說是陣列,結構體等 的整數倍開始 比...

記憶體對齊原則

一 記憶體對齊的原因 1 平台移植原因 不是所有的硬體平台都能任意訪問任意位址上的資料,有些硬體平台只能在某些特定位址處讀取特定的資料,否則會丟擲硬體異常 2 效能原因 資料結構 尤其是棧 應盡可能的在自然邊界對齊。原因在於,訪問未對齊的記憶體,處理器需要進行兩次訪問,而訪問對齊的記憶體,處理器只需...