一篇文章帶你了解C語言內(nèi)存對齊解決的問題
一、內(nèi)存對齊為4個字節(jié)的好處
首先,了解一下CPU從內(nèi)存里讀取數(shù)據(jù)的流程:
第一步,CPU通過地址總線,找到該數(shù)據(jù)的位置。
第二步,通過控制總線,發(fā)送讀取數(shù)據(jù)的指令。
第三步,通過數(shù)據(jù)總線,從內(nèi)存里獲取該數(shù)據(jù)的內(nèi)容。

內(nèi)存對齊使用4個字節(jié)的原因有:
1.STM32單片機的數(shù)據(jù)總線與地址總線都是32bit(4個字節(jié))。
2.方便DMA的搬運,DMA搬運的最大內(nèi)存是32bit(4個字節(jié))。
二、內(nèi)存對齊的目的是以空間換取速度
2.1、內(nèi)存對齊為4的例子
/* 先來一個簡單的結構體 */
struct
{
char a;
int b;
}Test2;

CPU讀取內(nèi)存里數(shù)據(jù)的過程:
1.想找變量a:第一次讀取就能找到。
2.想找變量b:第二次讀取就能找到。
這一點很重要,變量a與變量b各自只需要1次尋址就能完成讀取。接下來看一看內(nèi)存如果沒有使用內(nèi)存對齊的例子(當我不知道內(nèi)存對齊時,我也是誤以為內(nèi)存里的數(shù)據(jù)是這樣分布的?。?/p>
2.2、內(nèi)存沒有使用內(nèi)存對齊的例子
如果內(nèi)存沒有使用內(nèi)存對齊的話,構想的內(nèi)存分布如下:

CPU讀取數(shù)據(jù)的過程:
1.想找變量a:第一次讀取就能找到。
2.想找變量b:先讀取第一組內(nèi)存的后三個字節(jié),接著再讀取第二組內(nèi)存的第一個字節(jié),最后將所有字節(jié)合并為4個字節(jié)。
如果內(nèi)存沒有使用內(nèi)存對齊的話,CPU為了獲取變量b花掉了兩次地址尋址,接著還要將字節(jié)合并。所以,內(nèi)存對齊可以有效地提高CPU讀寫內(nèi)存的速度,但是浪費一點空間。
三、掌握內(nèi)存對齊的必要性
了解內(nèi)存對齊的作用后,就能弄懂為什么編譯器要對某些內(nèi)存做了填充。比如本章節(jié)的例子,如果結構體里只有一個char與int變量,無論是char變量在前,還是int變量在前,都肯定會浪費3個字節(jié)被用于填充,湊夠4個字節(jié)變成一組數(shù)據(jù)被CPU一次性讀取。
總結
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
C++?move()函數(shù)及priority_queue隊列使用記錄
move(obj)函數(shù)的功能是把obj當做右值處理,可以應用在對象的移動上,這篇文章主要介紹了C++?move()函數(shù)及priority_queue隊列使用記錄,需要的朋友可以參考下2023-01-01
C/C++?Qt?數(shù)據(jù)庫QSql增刪改查組件應用教程
Qt?SQL模塊是Qt中用來操作數(shù)據(jù)庫的類,該類封裝了各種SQL數(shù)據(jù)庫接口,可以很方便的鏈接并使用。本文主要介紹了Qt數(shù)據(jù)庫QSql增刪改查組件的應用教程,感興趣的同學可以學習一下2021-12-12

