整數邊界對齊方式 嵌入式基礎 位元組對齊

2021-10-14 13:25:14 字數 1435 閱讀 3099

一、記憶體訪問對齊規則

從高階語言的視角看,記憶體訪問是是位元組為單位的。

但是從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位元組對齊,結構體內元素按照預設規則對齊。

aligned關鍵字可以修改變數,結構體

(3)

struct __attribute__((packed)) s

結構體忽略對齊規則,緊湊排列
**及執行結果:

整數邊界對齊方式 c中結構體邊界對齊

原則1 普通資料成員對齊規則 第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為 位元組,則要從4的整數倍位址開始儲存 原則2 結構體成員對齊規則 如果乙個結構裡有某些結構體成員,則該結構體成員要從其內部最大元素大小的整數倍位址...

整數邊界對齊方式 C高階 記憶體對齊

碼字不易,對你有幫助點讚 關注支援一下作者不會程式設計的程式圓看更多乾貨,獲取第一時間更新如果想看比較好看的排版,可以閱讀原文 c高階 四 記憶體對齊 mp.weixin.qq.com 我們這一節主要來講一相關的些比較重要的知識。struct s1 上面是乙個結構體,也是我們自定義的一種型別。我們知...

嵌入式基礎

以應用為中心 以計算機技術為基礎,軟硬體可裁剪,應用系統對功能 可靠性 成本 體積 功耗和應用環境有特殊要求的專用計算機系統。是將應用程式 作業系統和計算機硬體整合在一起的系統。1.嵌入式系統的構成 嵌入式微處理器 嵌入式作業系統 外圍應用裝置 應用軟體系統。2.嵌入式處理器 嵌入式微處理器 嵌入式...