一、記憶體訪問對齊規則
從高階語言的視角看,記憶體訪問是是位元組為單位的。
但是從cpu角度看,記憶體訪問粒度與指令有關,比如1位元組訪問,2位元組訪問,4位元組訪問,8位元組訪問等。
如果在程式設計過程中不注意記憶體對齊,可能引發一系列問題:
1,非對齊訪問需要硬體修正。比如讀取4位元組資料,如果從4位元組對齊位址讀取,只需要一條指令,如果從非對齊位址讀取需要讀取兩次,然後cpu做資料重組。2,非對齊訪問帶來的多核cache偽共享問題。假設系統是雙核,cpu0/1分別關注data0/1如果因為資料對齊問題導致資料跨cache line,cpu0/1分別將data0/1載入進自己的cache,cache一致性協議將強制在cpu0更新data0資料後強制將整個cache line同步到cpu1的cache。此動作將使記憶體訪問停滯,浪費記憶體頻寬。
異構計算,多機通訊時,通過結構體進行資料通訊。體系結構/編譯器可能導致結構體對齊方式不同,引起資料通訊錯誤。
硬體在處理非對齊訪問時觸發異常。輕則資料錯誤,重則系統宕機。二、記憶體對齊實操2.1結構體內存對齊規則
例項分析:
struct s1
s1;
上述結構的記憶體分布:
s2;上述結構的記憶體分布:
2.2軟體控制記憶體對齊
(1)
#pragma pack(n)
struct s
#paragma pack()
結構體元素按照n位元組對齊,同時結構體大小也按照n位元組對齊(2)
struct __attribute__((aligned(n))) s
結構體大小按照n位元組對齊,結構體內元素按照預設規則對齊。(3)aligned關鍵字可以修改變數,結構體
struct __attribute__((packed)) s
結構體忽略對齊規則,緊湊排列**及執行結果:
整數邊界對齊方式 c中結構體邊界對齊
原則1 普通資料成員對齊規則 第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為 位元組,則要從4的整數倍位址開始儲存 原則2 結構體成員對齊規則 如果乙個結構裡有某些結構體成員,則該結構體成員要從其內部最大元素大小的整數倍位址...
整數邊界對齊方式 C高階 記憶體對齊
碼字不易,對你有幫助點讚 關注支援一下作者不會程式設計的程式圓看更多乾貨,獲取第一時間更新如果想看比較好看的排版,可以閱讀原文 c高階 四 記憶體對齊 mp.weixin.qq.com 我們這一節主要來講一相關的些比較重要的知識。struct s1 上面是乙個結構體,也是我們自定義的一種型別。我們知...
嵌入式基礎
以應用為中心 以計算機技術為基礎,軟硬體可裁剪,應用系統對功能 可靠性 成本 體積 功耗和應用環境有特殊要求的專用計算機系統。是將應用程式 作業系統和計算機硬體整合在一起的系統。1.嵌入式系統的構成 嵌入式微處理器 嵌入式作業系統 外圍應用裝置 應用軟體系統。2.嵌入式處理器 嵌入式微處理器 嵌入式...