記憶體對齊及大小端

2021-06-14 12:11:37 字數 1259 閱讀 5281

一  記憶體對齊問題

先看乙個面試題(c++): 

union  s;

struct  b

long  a;

union  s;

求sizeof(union s) ?   //24

sizeof(struct b) ?   //32

有幾個問題需要回答,記憶體對齊的規則是什麼? 這個union 物件在記憶體中資料是怎麼排列的? 大端小端都一樣嗎?

1) 記憶體對齊的規則

1. 結構體或聯合在記憶體中,第乙個資料的位置為offset為0的位置. 其他每個資料都放在該成員最小集整數倍位置。 如char[5]  放在1的整數倍的位置(而不是5)。

2. 如果結構體巢狀了結構體,則需要從該結構體最大元素的整數倍開始儲存。

3.結構體的總大小為最大成員(如果是陣列,則只取乙個就可以了)的總數倍。

二  關於大小端

#i nclude

union

a;void main()

答案:266  ??

2) 大小端問題

現在大多數系統都是小端的,跟cpu型別有關。

16bit寬的數0x1234在little-endian模式cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:

記憶體位址 0x4000 0x4001

存放內容 0x34 0x12

下面來看下union在大小端如何處理的?

union au{

int a;

char b;

union au a;

a.a = 1;

位址a------------------------------------

|a       |a+1   |a+2    |a+3 | int a;

|0x01|0x00   |0x00   |0x00 |

-------------------------------------

|a      |char b;

|          |

大端:------------------------------------

|a       |a+1   |a+2    |a+3 | int a;

|0x00 |0x00   |0x00   |0x01|

-------------------------------------

|a      |char b;

|          |

mysql 大小端 記憶體大小端對齊

不同的 cpu 有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種 le little endian 最符合人的思維的位元組序 位址低位儲存值的低位 位址高位儲存值的高位 怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說 低位值小,就應該放在記憶...

大小端對齊

不同的 cpu 有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種 基本知識,回顧一下 le little endian 最符合人的思維的位元組序 位址低位儲存值的低位 位址高位儲存值的高位 怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說 低位...

大小端對齊

int num int abcd printf x n num 閒來無事,寫了上面的兩句 num會列印出什麼呢?一般分析 根據ansii碼,轉換成十六進製制,為61626364 可是輸出結果為 64636261 我們可能會懷疑指標num,printf出位址後,它和a 0 的位址一樣。然後,可能會懷疑...