C/CPP 結構體、聯合體、位段內存計算 指南

C/CPP 結構體、聯合體、位段內存計算 指南

?? 在C語言中,結構體、聯合體和位段是對數據的高級抽象,它們可以讓程序員以更易于理解的方式來操作復雜的數據結構。然而,這些結構在內存中的布局可能并不如它們的語法結構那樣直觀,特別是當涉及到內存對齊和位段時。因此,理解這些結構在內存中的占用情況對編寫高效的C程序非常重要。


零、常見內置類型占用大小

數據類型字節大小(Byte)位大小(Bit)
char18
short216
int432
long4 或 8(視平臺而定)32 或 64
long long864
float432
double864
long double12 或 16(視平臺而定)96 或 128
unsigned char18
unsigned short216
unsigned int432
unsigned long4 或 8(視平臺而定)32 或 64

一、結構體內存計算

1.1 結構體的定義與內存對齊

?? C語言中的結構體(struct)是用于將不同類型的變量組合在一起的用戶自定義數據類型。編譯器為了提高CPU訪問速度,通常會對結構體成員進行內存對齊操作,即將成員存儲在某些地址邊界上。

示例:
#include <stdio.h>struct A {char c;int i;short s;
};int main() {printf("Size of struct A: %lu\n", sizeof(struct A));return 0;
}

?? 上述結構體中,成員的內存對齊方式會導致內存空隙的存在。char類型通常占1字節,int類型占4字節,而short類型占2字節。但在實際內存分配中,結構體A的大小可能是12字節而非7字節,因為編譯器為了內存對齊,會在char后面添加3字節的填充。

1.2 內存對齊規則

  • 結構體的每個成員按其類型的大小進行對齊。
  • 結構體的總大小必須是最大成員大小的整數倍。
示例:
struct B {char c1;char c2;int i;
};int main() {printf("Size of struct B: %lu\n", sizeof(struct B));return 0;
}

?? 在這個例子中,兩個char類型的成員c1c2通常會被對齊到4字節邊界以便于后面的int成員,因此struct B的大小可能是8字節而不是6字節。


二、聯合體內存計算

2.1 聯合體的定義與特點

?? C語言中的聯合體(union)允許在相同的內存空間中存儲不同類型的數據。所有的成員共用同一塊內存,因此聯合體的大小等于最大成員的大小。

示例:
#include <stdio.h>union C {int i;char c;double d;
};int main() {printf("Size of union C: %lu\n", sizeof(union C));return 0;
}

?? 在這個例子中,union C的大小等于double類型的大小(通常為8字節),因為它是最大成員。聯合體中的其他成員也共享這8字節的內存。

2.2 聯合體的內存管理

?? 由于聯合體的所有成員共享同一塊內存,只有一個成員可以在任意時刻保存有效數據。使用聯合體時應小心管理數據,以避免數據被意外覆蓋。


三、位段(Bit Fields)內存計算

3.1 位段的定義與用途

?? C語言中的位段允許在結構體中定義占用特定位數的成員。它們常用于硬件寄存器編程和節省內存的場景。

示例:
#include <stdio.h>struct D {unsigned int a : 3;unsigned int b : 5;unsigned int c : 8;
};int main() {printf("Size of struct D: %lu\n", sizeof(struct D));return 0;
}

?? 在這個例子中,struct D中的三個成員分別占用了3位、5位和8位,總共16位。根據內存對齊規則,結構體D的大小會依賴于目標平臺的內存分配機制。在32位系統中,struct D可能會占用4字節(32位),而在某些系統中可能會進一步優化。

3.2 位段的內存對齊

?? 位段成員的排列方式通常受制于目標機器的字節對齊要求。在某些系統中,位段可能無法跨字節邊界進行存儲,編譯器會自動填充以確保對齊。

3.3 注意事項

  1. 位段的定義依賴于具體的編譯器實現,跨平臺使用時可能表現不同。
  2. 位段的寬度不能超過基礎類型的大小。例如,一個unsigned int位段的寬度不能超過32位。

四、總結

?? 通過計算C語言中結構體、聯合體和位段的內存占用大小,程序員能夠更加清楚地了解程序的數據布局和效率。合理地選擇數據結構并理解內存對齊規則,可以有效減少內存浪費,優化系統性能。這在嵌入式系統、硬件編程、數據傳輸等場景中尤其重要。尤其是當我們需要在資源受限的系統中最大限度地壓縮內存占用時,位段等技術提供了極大的靈活性。

內存計算的意義在于:

  1. 提高程序的內存效率:合理設計結構體可以減少填充字節,減少內存開銷。
  2. 優化性能:內存對齊可以提升CPU訪問內存的效率,避免性能損耗。
  3. 便于跨平臺移植:了解不同平臺的內存對齊規則有助于編寫跨平臺的可移植代碼。
  4. 精確控制硬件資源:在與硬件設備交互時,位段的使用可以幫助控制硬件寄存器中的具體位,提高控制精度。

?? 通過這些優化,可以在多種場景中有效提升C/CPP程序的性能和資源利用率。

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

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

相關文章

ASR(語音識別)語音/字幕標注 通過via(via_subtitle_annotator)

文章目錄 1 VIA 官網資料2 語音/字幕標注3 鍵盤快捷鍵常規當一個時間片段被選中時圖像或視頻幀中的空間區域 1 VIA 官網資料 VIA官網&#xff1a;https://www.robots.ox.ac.uk/~vgg/software/via/ VIA官網標注示例&#xff1a;https://www.robots.ox.ac.uk/~vgg/software/via/…

mq安裝新版-3.13.7的安裝

一、下載包&#xff0c;上傳到服務器 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-generic-unix-3.13.7.tar.xz 二、 erlang直接安裝 rpm -ivh erlang-26.2.4-1.el8.x86_64.rpm不需要配置環境變量&#xff0c;直接就安裝了。 erl…

高通平臺PCIE EP模式log丟失問題

高通平臺PCIE EP模式log丟失問題 1 問題背景2 問題分析2.1 對比USB2.1.1 Logtool優化2.1.2 Device mhi與fs對比2.2 優化方案2.2.1 Diag系統優化2.2.2 Host mhi優化3 最終成果1 問題背景 高通5G模組如SDX55\SDX62\SDX65\SDX72\SDX75等支持pcie ep模式。會通過pcie與host(如MT7…

Python應用輸入輸出函數

大家好!在 Python 編程中&#xff0c;輸入輸出函數是與用戶進行交互的橋梁。通過輸入函數&#xff0c;我們可以獲取用戶的輸入數據&#xff1b;通過輸出函數&#xff0c;我們可以向用戶展示程序的運行結果。對于初學者來說&#xff0c;掌握基本的輸入輸出操作是編程入門的重要一…

如何使用 Ansible 在 Ubuntu 24.04 上安裝和設置 LNMP

在當今世界,自動化是有效管理和部署 Web 應用程序的關鍵。Ansible 是一個強大的自動化工具,它是一款開源軟件配置、配置管理和應用程序部署工具。本文將指導您使用 Ansible 在 Ubuntu 服務器上安裝 LNMP 堆棧(Linux、Nginx、MySQL、PHP)。 先決條件 為了執行本指南中討論的…

Xela矩陣三軸觸覺傳感器的工作原理解析與應用場景

Xela矩陣三軸觸覺傳感器通過先進技術模擬人類觸覺感知&#xff0c;幫助設備實現精確的力測量與位移監測。其核心功能基于磁性三維力測量與空間位移測量&#xff0c;能夠捕捉多維觸覺信息。該傳感器的設計不僅提升了觸覺感知的精度&#xff0c;還為機器人、醫療設備和制造業的智…

RK3288項目(四)--linux內核之V4L2框架及ov9281驅動分析(中)

目錄 一、引言 二、V4L2其他部件驅動分析 ------>2.1、mipi-dphy ------------>2.1.1、dts ------------>2.1.2、driver ------------>2.1.3、notifier機制 ------------>2.1.4、異步回調 ------------>2.1.5、V4L2 subdev ------>2.2、mipi-csi…

容器-使用slim減少10x+大模型鏡像

slim&#xff08;原docker-slim&#xff09;是一個開源工具&#xff0c;全稱SlimToolkit&#xff08;https://github.com/slimtoolkit/slim&#xff09;&#xff0c;用于基于已有的Docker鏡像減小鏡像的大小&#xff0c;同時盡可能保留容器的功能。它通過分析鏡像的運行環境和應…

Golang基礎學習

?????????? 初見golang語法 go項目路徑 cd $GOPATH //ls可以看到有bin,pkg,src三個文件 cd src/ mkdir GolangStudy cd GolangStudy mkdir firstGolanggo程序執行&#xff1a; go run hello.go//如果想分兩步執行&#xff1a; go build hello.go ./hello導入包的…

OPenCV CUDA模塊圖像處理-----對圖像執行 均值漂移濾波(Mean Shift Filtering)函數meanShiftFiltering()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 在 GPU 上對圖像執行 均值漂移濾波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于圖像分割或平滑處理。 該函數將輸入圖像中的…

電路圖識圖基礎知識-遠程/本地啟停電動機(二十一)

在實際的生產中&#xff0c;經常會需要電動機的控制可以就地控制和遠方控制&#xff0c;在集中的控制室中&#xff0c;遠 方控制電動機的啟動、停止。在就地設置啟動、停止按鈕或是緊急停車按鈕&#xff0c;以滿足生產的需要。 1.遠程、多點及連鎖控制電動機電路 2.元器件配置…

SpringBoot+uniapp 的 Champion 俱樂部微信小程序設計與實現,論文初版實現

摘要 本論文旨在設計并實現基于 SpringBoot 和 uniapp 的 Champion 俱樂部微信小程序&#xff0c;以滿足俱樂部線上活動推廣、會員管理、社交互動等需求。通過 SpringBoot 搭建后端服務&#xff0c;提供穩定高效的數據處理與業務邏輯支持&#xff1b;利用 uniapp 實現跨平臺前…

【深度學習新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配問題) 是機器學習,尤其是強化學習(RL)中的核心挑戰之一,指的是如何將最終的獎勵或懲罰準確地分配給導致該結果的各個中間動作或決策。在序列決策任務中,智能體執行一系列動作后獲得一個最終獎勵,但每個動作對最終結果的貢獻程度往往…

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.

這個警告表明您在使用Vue的esm-bundler構建版本時&#xff0c;未明確定義編譯時特性標志。以下是詳細解釋和解決方案&#xff1a; ?問題原因?&#xff1a; 該標志是Vue 3.4引入的編譯時特性標志&#xff0c;用于控制生產環境下SSR水合不匹配錯誤的詳細報告1使用esm-bundler…

Vue.js教學第二十一章:vue實戰項目二,個人博客搭建

基于 Vue 的個人博客網站搭建 摘要: 隨著前端技術的不斷發展,Vue 作為一種輕量級、高效的前端框架,為個人博客網站的搭建提供了極大的便利。本文詳細介紹了基于 Vue 搭建個人博客網站的全過程,包括項目背景、技術選型、項目架構設計、功能模塊實現、性能優化與測試等方面。…

32位尋址與64位尋址

32位尋址與64位尋址 32位尋址是什么&#xff1f; 32位尋址是指計算機的CPU、內存或總線系統使用32位二進制數來標識和訪問內存中的存儲單元&#xff08;地址&#xff09;&#xff0c;其核心含義與能力如下&#xff1a; 1. 核心定義 地址位寬&#xff1a;CPU或內存控制器用32位…

如何在Spring Boot中使用注解動態切換實現

還在用冗長的if-else或switch語句管理多個服務實現? 相信不少Spring Boot開發者都遇到過這樣的場景:需要根據不同條件動態選擇不同的服務實現。 如果告訴你可以完全擺脫條件判斷,讓Spring自動選擇合適的實現——只需要一個注解,你是否感興趣? 本文將詳細介紹這種優雅的…

開疆智能Ethernet/IP轉Modbus網關連接鳴志步進電機驅動器配置案例

在工業自動化控制系統中&#xff0c;常常會遇到不同品牌和通信協議的設備需要協同工作的情況。本案例中&#xff0c;客戶現場采用了 羅克韋爾PLC&#xff0c;但需要控制的變頻器僅支持 ModbusRTU 協議。為了實現PLC 對變頻器的有效控制與監控&#xff0c;引入了開疆智能Etherne…

Neovim - LSP 底層原理,難點配置(二)

Neovim LSP 的工作原理 基本概念 LSP(Language Server Protocol)可以理解成是一個"語言助手"。每種編程語言都有自己的"語言助手"(比如 TypeScript 的 tsserver),這些助手能告訴你: 哪寫錯了(語法錯誤)哪能跳轉(方法定義,引用)哪可以補全(自…

UNECE R152——解讀自動駕駛相關標準法規(AEB)

Uniform provisions concerning the approval of motor vehicles with regard to the Advanced Emergency Braking System (AEBS) for M1 and N1 vehicles(2021) 原文鏈接&#xff1a;https://unece.org/sites/default/files/2024-03/R152r1am1e%20%282%29.pdf 核心內容解析 …