內存對齊的使用和禁用

在 C 語言和 C++ 中,__attribute__((packed))?是一種用于數據結構體的編譯器擴展屬性,這個屬性主要用于修改結構體的內存對齊行為。

背景知識:結構體內存對齊

在許多計算機架構中,編譯器會自動對數據進行對齊(alignment),也就是說,數據在內存中的地址會遵循一定的對齊規則。這是為了提升數據訪問的效率,因為許多處理器在訪問對齊的內存地址時速度更快。通常,結構體的每個成員會根據其數據類型按照某種對齊規則進行對齊,同時整個結構體也會有自然對齊值,以適應其最大成員類型的對齊要求。

對齊帶來的問題 & 解決:

默認情況下,結構體中的每個成員會在內存中按照其對齊要求進行排列,這可能會導致在兩個成員之間出現空閑的字節(稱為填充字節),從而浪費一些內存空間。這種內存的浪費在嵌入式系統或者對內存占用敏感的應用場景中可能會被認為不可接受。

使用?__attribute__((packed))?的意義

  • __attribute__((packed))?是 GCC 編譯器的一個擴展功能,用于要求編譯器對指定的數據結構取消默認的對齊填充。
  • 有了?packed?屬性,編譯器會盡量緊密排列結構體的成員,將數據結構的大小減小到可能的最小值,即所有的字段按照聲明的順序緊密排列,而不插入任何額外的填充字節。
應用情境:
  • 節省內存:在一些內存受限的環境中,例如某些嵌入式系統。
  • 數據協議格式固定:結構體用于與特定格式的存儲或通信協議(例如文件格式或網絡數據包)進行交互,確保數據對齊和結構體內存布局一致性。

__attribute__((packed))?或?#pragma pack?會禁用對齊,緊湊排列結構體的成員。

以下是代碼示例:

#include <stdio.h>#pragma pack(push, 1)  // 設置為1字節對齊
struct packed_struct {char a;       // 1字節int b;        // 4字節short c;      // 2字節
};
#pragma pack(pop)  // 恢復默認對齊struct normal_struct {char a;       // 1字節int b;        // 4字節short c;      // 2字節
};int main() {printf("Size of normal_struct: %zu bytes\n", sizeof(struct normal_struct));printf("Size of packed_struct: %zu bytes\n", sizeof(struct packed_struct));return 0;
}

代碼解析

  1. normal_struct

    • 系統會自動對齊結構體成員,默認對齊方式通常基于成員最大類型的大小(如int為4字節、short為2字節)。
    • char a占用1字節,但后面會填充3字節(以滿足int的對齊要求)。
    • int b?正常對齊,占用4字節。
    • short c?后面可能還會補齊額外字節(如果需要),使結構體總大小為int的倍數。
  2. packed_struct

    • 禁用了默認對齊規則,結構體的成員按緊湊方式存放。
    • 泄露的空間被完全消除,每個成員緊跟前一個成員存儲。

運行結果(可能因平臺不同而異)

假設在一個系統中:

  • int是4字節,short是2字節,char是1字節。
    運行結果可能如下:
Size of normal_struct: 12 bytes
Size of packed_struct: 7 bytes

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

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

相關文章

SpringBoot3后端項目介紹:mybig-event

mybig-event 項目簡介 mybig-event 是一個基于 Spring Boot 的事件管理系統&#xff0c;提供用戶管理、文章發布、分類管理、文件上傳等功能&#xff0c;采用現代化的 Java 技術棧構建&#xff0c;支持高效開發和部署。 倉庫鏈接&#xff1a;https://github.com/foorgange/mybi…

week3-[分支嵌套]方陣

week3-[分支嵌套]方陣 題目描述 有 nmn\times mnm 個人站成 nnn 行 mmm 列的方陣。我們想知道第 xxx 行 yyy 列的人的某個方向有沒有人。 輸入格式 輸入共 222 行。 第 111 行輸入 444 個正整數 n,m,x,yn,m,x,yn,m,x,y。 第 222 行輸入 111 個字符為 U、D、L、R 其中之一&#…

深入理解C++ std::shared_ptr:現代C++內存管理的藝術與實踐

在C++的發展歷程中,內存管理始終是開發者面臨的核心挑戰。從C語言繼承而來的手動內存管理方式,雖然提供了極大的靈活性,卻也成為無數程序錯誤的根源。內存泄漏、懸空指針、雙重釋放等問題長期困擾著C++開發者,直到智能指針的出現改變了這一局面。作為C++11標準引入的重要特…

一個 WPF 文檔和工具窗口布局容器

一個 WPF 文檔和工具窗口布局容器、用于排列文檔 和工具窗口的方式與許多知名 IDE 類似&#xff0c;例如 Eclipse、Visual Studio、 PhotoShop 等等 AvalonDock 是一個 WPF 文檔和工具窗口布局容器&#xff0c;用于排列文檔 和工具窗口的方式與許多知名 IDE 類似&#xff0c;例…

【qml-5】qml與c++交互(類型單例)

背景&#xff1a; 【qml-1】qml與c交互第一次嘗試&#xff08;實例注入&#xff09; 【qml-2】嘗試一個有模式的qml彈窗 【qml-3】qml與c交互第二次嘗試&#xff08;類型注冊&#xff09; 【qml-4】qml與c交互&#xff08;類型多例&#xff09; 【qml-5】qml與c交互&#…

循環神經網絡(RNN)、LSTM 與 GRU (一)

循環神經網絡&#xff08;RNN&#xff09;、LSTM 與 GRU &#xff08;一&#xff09; 文章目錄循環神經網絡&#xff08;RNN&#xff09;、LSTM 與 GRU &#xff08;一&#xff09;循環神經網絡&#xff08;RNN&#xff09;、LSTM 與 GRU一、RNN&#xff08;Recurrent Neural N…

【AAOS】Android Automotive 16模擬器源碼下載及編譯

源碼下載repo init -u https://android.googlesource.com/platform/manifest -b android-16.0.0_r2 repo sync -c --no-tags --no-clone-bundle源碼編譯source build/envsetup.sh lunch sdk_car_x86_64-bp2a-eng make -j8運行效果emualtorHomeAll appsSettingsHAVCNotification…

jvm三色標記

好的&#xff0c;咱們把專業概念和生活例子結合起來&#xff0c;一步一步說清楚三色標記法&#xff1a;一、核心概念&#xff1a;用“顏色”給對象貼“狀態標簽”就像給家里的物品貼標簽&#xff0c;每種顏色代表它在“垃圾回收&#xff08;大掃除&#xff09;”中的狀態&#…

生成式AI的能力邊界與職業重構:從“百科實習生“到人機協作增強器

根據微軟最新研究&#xff0c;基于20萬條Copilot使用數據及用戶反饋&#xff0c;研究者揭示了生成式AI在實際應用中的能力邊界與職業影響。數據顯示&#xff0c;用戶使用AI助手最頻繁的任務是信息獲取&#xff08;占比近40%&#xff09;&#xff0c;其次是公眾溝通類工作&#…

java17學習筆記

Java17是一個重要的特性發布&#xff0c;也是比較常用的一個版本&#xff0c;根據 2024Java生態統計&#xff0c;Java 17、11 和 8 的用戶比例分別為 35%、33% 和 29%。它遵循了自Java10以來引入的Java發布步調&#xff0c;并于2021年 9 月 14 日發布&#xff0c;在Java16發布后…

【AI應用】修改向量數據庫Milvus默認密碼

說明&#xff1a; 1&#xff09;部署向量數據庫milvus運行一段時間后&#xff0c;想開啟密碼認證登錄attu頁面 2&#xff09;開啟密碼認證登錄&#xff0c;提示用戶和密碼不正確&#xff0c;因為默認密碼已存儲在物理機 3&#xff09;通過attu管理頁面修改向量數據庫milvus默認…

分布式系統消息隊列:可靠投遞與延時消息實戰

在分布式系統架構中&#xff0c;消息隊列&#xff08;MQ&#xff09;作為解耦服務、削峰填谷、異步通信的核心組件&#xff0c;其消息投遞的可靠性與延時消息的精準性直接影響業務系統的穩定性。本文結合實際業務場景&#xff0c;詳細解析消息投遞的全流程設計與延時消息的通用…

Java 學習筆記(基礎篇6)

面向對象基礎1. 類和對象(1) 示例&#xff1a;public class Student {String name "張三";int age 23;public void study() {System.out.println("學習 Java");}public void eat() {System.out.println("吃飯");} }public class Test {public …

光學件加工廠倚光科技:陪跑光學未來力量

在光學創新的漫漫長路上&#xff0c;總有一些看似 “不劃算” 的堅持&#xff0c;卻在悄然改寫行業的未來。倚光科技的故事&#xff0c;就始于這樣一種選擇 —— 明知光學打樣利潤微薄&#xff0c;明知上百個項目中能走到量產的寥寥無幾&#xff0c;仍愿意投入全球頂尖的設備與…

RabbitMQ:生產者可靠性(生產者重連、生產者確認)

目錄一、生產者重連二、生產者確認一、生產者重連 當網絡不穩定的時候&#xff0c;利用重試機制可以有效提高消息發送的成功率。不過SpringAMQP提供的重試機制是阻塞式的重試&#xff0c;也就是說多次重試過程中&#xff0c;當前線程是被阻塞的&#xff0c;會影響業務性能。 …

【深度學習新浪潮】空天地數據融合技術在城市三維重建中的應用

空天地數據融合技術在城市三維重建中的應用已取得顯著進展,尤其在提升精度以滿足具身智能機器人仿真訓練需求方面,研究和產品均呈現多樣化發展。以下是關鍵研究進展、產品方案及精度要求的詳細分析: 一、研究進展與技術路徑 1. 多源數據融合的技術突破 時空基準統一:通過…

Selenium自動化測試入門:cookie處理

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快driver.get_cookies() # 獲得cookie 信息driver.get_cookies(name) # 獲得對應name的cookie信息add_cookie(cookie_dict) # 向cookie 添加會話信息delete_cookie(na…

快解析如何讓遠程訪問更安全?

一、勒索病毒攻擊服務器的途徑很多用戶服務器對外開放&#xff0c;實現外網訪問&#xff0c;擔心服務器被勒索病毒攻擊&#xff01;勒索病毒攻擊服務器的途徑之一是通過路由器開放的端口進行掃描攻擊&#xff0c;所以盡量不要在服務器的路由器和防火墻中開放端口二、快解析如何…

Linux下編譯ARPACK

本文記錄Linux下編譯ARPACK的流程。 零、環境 操作系統Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、依賴 1.1 安裝oneAPI 參見&#xff1a;Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 二、編譯ARPACK …

芋道RBAC實現介紹

說明&#xff1a;之前寫過一篇博客&#xff0c;介紹如何搭建一個基于角色的權限驗證框架 搭建一個基于角色的權限驗證框架 本文介紹在非常受歡迎的開源框架——芋道中是如何實現 RBAC 的&#xff0c;芋道的部署參考下面這篇文章&#xff1a; 芋道微服務代碼部署 介紹 一般…