C語言之內存對齊

一、為什么要內存對齊

Arm對內存的訪問支持字(4byte)、半字(2byte)、字節(1byte)的直接訪問,但是呢他們是有一定的要求的:

  • 存取字時要求地址按字對齊,也就是地址要是4的整數倍,如0x0000、0x0004、0x0008(該地址只是舉例,mcu的地址分配請參考具體手冊的地址映射圖)

  • 存取半字是要求地址按半字對齊,也就是地址是2的倍數,這樣假如通過0x0001、0x0003這樣非2倍數的地址來讀取一個半字就會進入硬件中斷錯誤

  • 存取字節簡單,只要地址不超范圍就可以

二、內存對齊的意義是什么??

? ? ? ? 提高內存訪問速度

????????盡管內存是以字節為單位,但是大部分處理器并不是按字節塊來存取內存的.它一般會以雙字節,四字節,8字節,16字節甚至32字節為單位來存取內存,我們將上述這些存取單位稱為內存存取粒度.

現在考慮4字節存取粒度的處理器取int類型變量(32位系統),該處理器只能從地址為4的倍數的內存開始讀取數據。

假如沒有內存對齊機制,數據可以任意存放,現在一個int變量存放在從地址1開始的聯系四個字節地址中,該處理器去取數據時,要先從0地址開始讀取第一個4字節塊,剔除不想要的字節(0地址),然后從地址4開始讀取下一個4字節塊,同樣剔除不要的數據(5,6,7地址),最后留下的兩塊數據合并放入寄存器.這需要做很多工作。但如果有內存對齊機制,那么直接從0地址讀出4個字節,就可以得到數據內容。

三、內存對齊規則

  • 數據成員對齊:成員根據其自身大小,從自身大小的整數倍內存地址(以第一個元素存儲在0位置為參考)開始存儲;
  • 結構體成員對齊:首個成員從偏移量?0?開始存儲。后續成員偏移地址為?min(自身對齊值, 編譯器指定對齊值)?的整數倍。
  • 結構體總大小對齊:結構體總大小需為?最大成員對齊值?的整數倍,不足時末尾填充字節。

四、如何實現內存對齊

#pragma pack(n)? ?作用:強制指定對齊值為?n

#pragma pack(1)      // 設置為1字節對齊(無填充)
struct Data {char a;          // 1字節 int b;           // 4字節(緊密排列)
};                   // sizeof = 5 
#pragma pack()       // 恢復默認對齊 

__attribute__((aligned(n)))? ? 作用:指定結構體/變量的最小對齊值。

struct __attribute__((aligned(8))) AlignStruct {char c;          // 結構體整體按8字節對齊 int i;
};                   // sizeof = 8(而非5)

注意:主要方式跨平臺,由于不同平臺編譯器默認的對齊大小不同,導致硬件中斷問題,例如Windows默認8字節對齊,Linux默認4字節

五、字節對齊應用場景

比如別人傳輸一大段數據過來,然后它默認一字節對齊,此時數據接收就會紊亂,這時候就必須強制對齊

typedef union  __attribute__((aligned(16)))  DataPacket {  uint16_t raw_bytes[10];     // 原始字節訪問接口 struct SensorData {  uint32_t temperature; // 溫度值 (4字節)uint8_t status;      // 狀態標志 (1字節)uint16_t id;         // 設備ID (2字節)uint8_t status2;      // 狀態標志 (1字節)uint8_t data[3];uint8_t status3;      // 狀態標志 (1字節)} sensor;
} DataPacket;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910198.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910198.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910198.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 基礎語法 -----函數

一、函數 1、函數是什么 編程中的函數和數學中的函數有一定的相似之處。 數學上的函數,比如 y sin x,x 取不同的值,y 就會得到不同的結果。 編程中的函數是一段可以被重復使用的代碼片段。 (1)求數列的和&#x…

Windows/Linux系統 Ollama部署deepseek 大模型

Ollama 是一個開源工具,專門用于在本地計算機上運行和操作大型語言模型(LLM) 官方下載網站(https://ollama.ai/) Windows系統安裝方法 建議命令行安裝(默認安裝會直接安裝到C盤) OllamaSetu…

用Tensorflow進行線性回歸和邏輯回歸(一)

這一章告訴你如何用TensorFlow構建簡單的機器學習系統。第一部分回顧構建機器學習系統的基礎特別是講函數,連續性,可微性。接著我們介紹損失函數,然后討論機器學習歸根于找到復雜的損失函數最小化的點的能力。我們然后講梯度下降,…

java/.net跨平臺UI瀏覽器SDK,瀏覽器控件開發包分析

在 Linux 系統中,雖然沒有完全等同于安卓 WebView 的內置瀏覽器 SDK,但存在多種基于開源瀏覽器引擎的解決方案,支持通過 Java 代碼控制網頁加載和執行 JavaScript。以下是具體實現方案和技術細節: 一、核心技術方案對比 方案名稱…

Taro 狀態管理全面指南:從本地狀態到全局方案

在跨端應用開發中,狀態管理是構建可維護、可擴展應用的核心環節。作為京東凹凸實驗室推出的多端統一開發框架,Taro 支持 React/Vue 等主流前端框架,自然也繼承了豐富的狀態管理生態。本文將全面剖析 Taro 中的各種狀態管理方案,從…

記錄一下jar做成windows服務問題

1、打包好jar 2、把jdk防止到和jar同一目錄下 3、下載winsw-x64.exe 和 sample-minimal.xml https://github.com/winsw/winsw/releases/download/v2.12.0/WinSW-x64.exehttps://github.com/winsw/winsw/releases/download/v2.12.0/WinSW-x64.exe sample-minimal.xmlhttps://…

【Dify 案例】【MCP實戰】【二】【超級助理】

我們創建一個工作流。你是一個超級助理,能夠根據輸入的指令,進行推理和自主調用工具,完成并輸出結果。 注意,需要判斷是否調用高德MCP來獲取對應工具協助你完成任務。 1.開始 2.策略大腦 2.1 AEGNT策略 2.2 工具列表 2.3 指令

Qt Quick 與 QML(二)qml中的頂級窗口

一、前言 在QML中,?頂級窗口不是絕對必需的?,但它在大多數應用場景中扮演著關鍵角色。 需要頂級窗口的典型場景: 1.獨立桌面/移動應用? 必須使用Window或ApplicationWindow作為根元素。 2.多窗口應用 每個獨立窗口都需要一個頂級窗口實例…

華為云Flexus+DeepSeek征文|DeepSeek-V3/R1 免費服務開通全流程與Rest API和OpenAI SDK調用詳解

華為云FlexusDeepSeek征文|DeepSeek-V3/R1 免費服務開通全流程與Rest API和OpenAI SDK調用詳解 前言 本文將詳細介紹DeepSeek-V3/R1 免費服務開通全流程,并且詳細講解通過本地方式Rest API和OpenAI SDK兩種方式調用DeepSeek-V3/R1 前提準備 1、訪問 Mod…

Qt 連接信號使用lambda表達式和槽函數的區別

1. 語法與代碼結構 成員函數 需在類中顯式聲明槽函數(public slots: 或 Qt 5 后的任意成員函數),并在連接時指定接收對象。 class Receiver : public QObject {Q_OBJECT public slots:void handleSignal(int value) { /* ... */ } };// 連接…

學習筆記丨AR≠VR:透視沉浸式技術的“虛實象限”法則

AR(增強現實)和VR(虛擬現實)是沉浸式技術的兩大分支,核心區別在于虛擬與現實的融合程度。以下是兩者的詳細對比: 對比維度 AR(增強現實) VR(虛擬現實) 技術…

本地使用 modelscope 大模型 來進行文本生成視頻(Text-to-Video)

1. ? 創建并激活 Conda 環境(Python 3.8) conda create -n modelscope python3.8 -yconda activate modelscope 2.? 安裝了 PyTorch(CPU 版本) 如果你是 CPU-only 用戶(沒有 NVIDIA 顯卡 或不想用 GPU&#xff0…

文生視頻(Text-to-Video)

🕒 生成時間:每張圖大概 10–60 秒(取決于設備) ? 二、文生視頻(Text-to-Video) 以下項目中,很多都基于 SD 模型擴展,但視頻生成復雜度高,生成時間一般 超過 30 秒&am…

CLion + STM32環境配置,親測有效(2025.06.19記)

CLion STM32環境配置 遇到的問題描述: > "moniton" command not supported by this target. > You cant do that when your target is exec > 上傳完成,但存在問題 > monitor reset > "monitor" command not …

借助ChatGPT快速開發圖片轉PDF的Python工具

一、開發背景與適用場景 隨著數字文檔處理需求的激增,圖片轉PDF的需求日益廣泛。從學生提交圖像化作業,到教師整合掃描試卷等資料,再到行政人員歸檔證件照片,工作中的方方面面都離不開圖片的處理。如何高效、批量地將多個圖片文件…

SuGAR代碼精簡解讀

目錄 一、全流程訓練腳本 train_full_pipeline.py 二、核心訓練邏輯 train.py 粗優化 (coarse_density_and_dn_consistency.py) 網格提取 (extract_mesh_from_coarse_sugar) 精優化 (refined_training) 兩次優化(粗優化和精優化)中使用的損失函數及…

大模型安全關鍵技術研究

? 引言 隨著人工智能技術的迅猛發展,大模型已成為推動各行業變革的核心力量。從智能客服、醫療影像識別到金融風險預測,大模型的應用場景不斷拓展,深刻改變著人們的生產生活方式。大模型已經轉變為AI領域的基礎設施,為解決各種…

java面試題04成員變量和局部變量的區別

成員變量(Member Variable)和局部變量(Local Variable)是面向對象編程中兩種作用域和生命周期不同的變量,主要區別體現在以下幾個方面: 1. 聲明位置 成員變量: 聲明在類內部、方法/構造器/代碼塊外部。 例如: public class Person {// 成員變量(實例變量)private Str…

升級到 .NET 9 分步指南

隨著激動人心的 .Net 9 更新正式發布,漫長的等待終于結束了。它帶來了一些令人驚嘆的特性,例如改進的 LINQ 功能、HybridCache 等等。此外,憑借其卓越的性能提升、更佳的安全性、更完善的協議和更易維護的特性,它必將吸引開發者和…

day30打卡

# 導入模塊 import math print("方式1:使用 import math") print(f"圓周率π的值:{math.pi}") print(f"2的平方根:{math.sqrt(2)}\n") # 導入特定項 from math import pi, sqrt print("方式2&#…