假設cpu要讀取乙個4位元組大小的資料到暫存器中(假設記憶體讀取粒度是4),分兩種情況討論:
1.資料從0位元組開始(記憶體對齊)
2.資料從1位元組開始(記憶體不對齊)
當資料從1位元組開始的時候,問題很複雜,首先先將前4個位元組讀到暫存器,並再次讀在這裡插入**片了這麼多額外操作,大大降低了cpu 的效能。
但是這還屬於樂觀情況,記憶體對齊的作用之一是平台的移植原因,因為只有部分cpu肯幹,其他部分cpu遇到未對齊邊界就直接罷工了。
a、結構體的記憶體對齊
1.在有#pragma pack巨集的情況下
有巨集定義的情況下 結構體的自身寬度 就是巨集上規定的數值大小 所有記憶體都按照這個寬度去布局
#pragma pack 引數只能是 『1』, 『2』, 『4』, 『8』, or 『16』
2.在沒有#pragma pack巨集的情況下
沒有巨集定義的情況下 結構體的自身寬度有最大成員屬性的寬度決定
以下為結構體對稱原則:
1、第乙個成員的首位址為0.
2、每個成員的首位址是自身大小的整數倍
3、結構體的總大小,為其成員中所含最大型別的整數倍。
簡單的說,每個成員距離首位址偏移量應該是自身大小的整倍數。
結構體內存對齊問題
問題描述 結構體內存對齊問題值直接的體現就是計算結構體的sizeof占用的位元組數。結構體內存對齊的幾個原則,有了這幾個原則,不管結構體裡面是什麼元素,我們都能夠正確算出sizeof值 以vs2013為例 原則2 在原則1的基礎上,檢查計算出的儲存單元是否為所有元素中最寬的元素的長度的整數倍,是,則...
結構體內存對齊問題
今天參加的c c 筆試,總的來說,感覺已經比以前好多了,相信是每天及時總結的緣故,廢話不多說,下面繼續堅持。今天大致做了三塊內容,首先計算機網路通訊,然後是資料結構部分,最後才是c c 的題目。前兩者另外再做小結,先就c c 1 記憶體對齊問題 對這個問題,以前我也總結過,一段時間沒有回看盡然有點忘...
結構體內存對齊
結構體內存對齊 一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這...