自然對(duì)齊意味著類型的地址是類型大小的倍數(shù)。
例如,字節(jié)可以位于任意地址,短字節(jié)(假定16位)必須位于2的倍數(shù)上,int(假設(shè)32位)必須位于4的倍數(shù)上,長(zhǎng)(假設(shè)64位)必須位于8的倍數(shù)上。
如果您訪問了一段未自然對(duì)齊的數(shù)據(jù),CPU要么會(huì)引發(fā)故障,要么會(huì)讀寫內(nèi)存,而不是作為原子操作。CPU所采取的操作將取決于體系結(jié)構(gòu)。
例如,圖像中的內(nèi)存布局如下:
01234567...XXXX.
和
int *data = (int*)3;
當(dāng)我們?cè)囍喿x*data
組成該值的字節(jié)分布在2個(gè)int大小塊中,1個(gè)字節(jié)位于塊0-3中,3個(gè)字節(jié)分布在塊4-7中?,F(xiàn)在,僅僅因?yàn)檫@些塊在邏輯上是相鄰的,這并不意味著它們是物理上的。例如,塊0-3可能位于CPU緩存行的末尾,而塊3-7位于頁文件中。當(dāng)CPU進(jìn)入訪問塊3-7以獲得它所需的3個(gè)字節(jié)時(shí),它可能會(huì)看到該塊不在內(nèi)存中,并發(fā)出它需要內(nèi)存分頁的信號(hào)。這可能會(huì)阻塞調(diào)用進(jìn)程,而操作系統(tǒng)會(huì)將內(nèi)存重新分頁。
在內(nèi)存被分頁之后,但是在您的進(jìn)程被喚醒之前,另一個(gè)進(jìn)程可能會(huì)出現(xiàn)并編寫一個(gè)Y
然后您的進(jìn)程被重新安排,CPU完成讀取,但是現(xiàn)在它已經(jīng)讀取了XYXX,而不是您期望的XXXX。