c++ int 转 short_C/C++结构体内存对齐
在面試或工作中,經(jīng)常會(huì)遇到內(nèi)存對齊的問題。這里結(jié)合我的理解談一談對內(nèi)存對齊的理解。
1. 為什么要內(nèi)存對齊,不對齊會(huì)怎么樣?
內(nèi)存中存放數(shù)據(jù)是為了給CPU使用,CPU訪問內(nèi)存數(shù)據(jù)時(shí)會(huì)受到地址總線寬度的限制,也就是一次能從內(nèi)存中拿多少數(shù)據(jù)到CPU(這里我們忽略CPU高速緩存)。而且,CPU從內(nèi)存中獲取數(shù)據(jù)時(shí)起始地址必須是地址總線寬度的倍數(shù)(我們用的intel CPU能處理不對齊的情況,某些CPU不能處理,即遇到不對齊程序會(huì)崩潰...)。
例如:CPU地址總線是64位(bit,8字節(jié)),當(dāng)一個(gè)int(4字節(jié))存儲(chǔ)到地址: 0x06 時(shí),CPU如何獲取這個(gè)int值?
第一步:讀取0x00~0x08 8個(gè)字節(jié),然后保存后兩個(gè)字節(jié)到 int 的前兩個(gè)字節(jié)。
第二步:讀取0x08~0x0F 8個(gè)字節(jié),然后保存前兩個(gè)字節(jié)到int的后兩個(gè)字節(jié)。
圖1-內(nèi)存訪問上面的例子可以看到,從內(nèi)存中讀取一個(gè)int到CPU中需要從內(nèi)存中讀取兩次。這樣大大降低了執(zhí)行的效率,如何提升性能? 答案就是內(nèi)存對齊!
2. 內(nèi)存對齊的單位是什么?
通過上面的分析,知道內(nèi)存對齊的目的是為了讓CPU能一次獲取到數(shù)據(jù),從而提升性能。學(xué)過匯編會(huì)了解,CPU只能使用基本類型,char, short, int, long, float, double 等,不能使用數(shù)組或結(jié)構(gòu)體等復(fù)合類型(匯編中并沒有一個(gè)指令能直接存取一個(gè)struct或數(shù)組)。所以:內(nèi)存對齊的單位是基本類型,目標(biāo)是讓CPU能一次獲取到基本類型的值。
3. 如何進(jìn)行內(nèi)存對齊?
通過上面的介紹,我們可以得出:
a. 內(nèi)存對齊是指,變量地址的對齊,而不是變量大小的對齊。變量地址的對齊是指變量地址 對 變量大小求模為0。
b. 結(jié)構(gòu)體中每一個(gè)成員都要求是內(nèi)存對齊的。
c. 結(jié)構(gòu)體中的數(shù)組,按數(shù)組的類型對齊。
4. 如何計(jì)算內(nèi)存對齊
分析內(nèi)存對齊,只需要記住上一個(gè)小節(jié)中:變量地址的對齊是指變量地址 對 變量大小求模為0。數(shù)組以數(shù)組本身的類型來計(jì)算,例如:char c[5] 按 char 類型大小計(jì)算對齊,double d[22] 按 double 類型大小計(jì)算對齊。
圖2-示例程序圖3-運(yùn)行結(jié)果通過這個(gè)示例,仔細(xì)想想,內(nèi)存對齊就很簡單了。
總結(jié)
以上是生活随笔為你收集整理的c++ int 转 short_C/C++结构体内存对齐的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简答题c语言文件操作顺序,计算机基础与程
- 下一篇: python处理excel可视化_pyt