結構體(位段)內存分配

?? 結構體由多個數據類型的成員組成。那編譯器分配的內存是不是所有成員的字節數總和呢?
在這里插入圖片描述

??首先,stu的內存大小并不為29個字節,即證明結構體內存不是所有成員的字節數和。
??其次,stu成員中sex的內存位置不在21,即可推測name成員起始內存位置在0。
??接著,stu成員中sex與age內存并不連續,兩者相隔4個字節。
??最后,sty成員中的sex與score內存連續,但sty的內存大小與sex的內存位置也是數值差4。

那結構體的內存分配滿足何種規則呢?

序號結構體內存對齊規則
1結構體的第?個成員對?到和結構體變量起始位置偏移量為0的地址處
2其他成員變量要對?到某個數字(對?數)的整數倍的地址處
3對?數=編譯器默認的?個對?數與該成員變量??的較?值
4VS 中默認的值為8,Linux中gcc沒有默認對?數,對?數就是成員??的??
5結構體總??為最?對?數(結構體中每個成員變量都有?個對?數,所有對?數中最?的)的整數倍。
6如果嵌套了結構體的情況,嵌套的結構體成員對?到??的成員中最?對?數的整數倍處,結構體的整體??就是所有最?對?數(含嵌套結構體中成員的對?數)的整數倍。

利用以上規則,我們就可以合理解釋文章開頭的疑問了。
在這里插入圖片描述
??char類型對齊數為1,可以儲存在任意位置;
??int類型對齊數為4,必須儲存在內存位置為4的倍數;
??sty結構體內存大小必須是成員最大對齊數的整數倍;

??從以上分析,我們可以得出結構體存在內存浪費。而避免浪費內存的最好編程習慣就是將成員字節數小的整合在一起。

??結構體(struct)在C和C++編程語言中是一種復合數據類型,它允許你將不同類型的數據項(變量)組合成一個單一的變量名。位段(Bit-fields)是結構體中的一種特殊成員,它允許程序員指定每個成員所占用的位數,而不是使用整個字節或更大的內存空間。位段通常用于硬件編程或需要精確控制內存使用的場合。

位段的基本語法如下:

struct {  type member_name : width;  // 其他成員...  
} structure_name;type 是基礎數據類型(通常是整數類型),它決定了位段的基本存儲單位。
member_name 是位段的名稱。
width 是一個整數,指定了該位段所占用的位數。
structure_name 是結構體的名稱。

示例
下面是一個使用位段的簡單示例:
在這里插入圖片描述

應用場景
硬件寄存器訪問·? 在硬件編程中,許多設備的寄存器由一系列位組成,每個位表示設備的不同狀態、配置選項或標志。使用位段可以方便地訪問和控制這些位,而無需進行復雜的位運算或掩碼操作。??? ·? 例如,一個硬件設備的狀態寄存器可能有多個位字段,分別表示設備的不同狀態。通過使用位段,程序員可以直接通過結構體的成員名來訪問這些位字段,從而簡化代碼并提高可讀性。
節省存儲空間·? 當需要存儲大量的小規模數據時,位段可以有效地節省存儲空間。例如,在過程控制、參數檢測或數據通信等應用中,控制信息往往只占一個字節中的一個或幾個二進制位。通過使用位段,可以將多個這樣的信息存儲在一個字節中,從而節省存儲空間。? ?? ? ? ? ? ? ? ? · ? 參考文章提到,位段能夠把長度為奇數的數據包裝在一起,節省存儲空間。當程序需要成千上萬個這樣的結構體時,選擇位段是比較明智的。
訪問整數值的部分內容·? 位段允許程序員方便地訪問一個整數值的部分內容。這在處理包含多個不同含義的位的整數值時非常有用。通過定義位段,可以將整數值分解為多個有意義的字段,并直接訪問這些字段的值。
·? 例如,在TCP/IP協議中,數據包頭通常由多個字段組成,每個字段占用不同的位數。通過使用位段,可以方便地解析數據包頭并提取所需的字段值。
提高代碼可讀性·? 通過使用位段,可以將整數值分解為多個有意義的字段,并為每個字段分配一個具有描述性的名稱。這有助于提高代碼的可讀性和可維護性。程序員可以更容易地理解代碼的目的和功能,并更輕松地修改和維護代碼。
注意事項
跨平臺和編譯器差異位段的具體行為可能因編譯器和平臺而異。不同的編譯器可能會對位段的布局、填充和訪問方式進行不同的解釋。因此,在使用位段時,應確保你的代碼在所有目標平臺上都能正常工作。
內存對齊編譯器可能會在位段之間插入填充字節,以確保結構體成員在內存中的對齊。這可能會導致位段的實際內存布局與你在代碼中指定的不同。
位段的大小限制位段的大小通常受到其基礎數據類型大小的限制。例如,如果你使用unsigned int作為位段的基礎數據類型,并且你的系統中unsigned int是32位的,那么任何unsigned int位段的最大寬度都不能超過32位。
訪問和修改由于位段的行為可能因編譯器而異,因此在使用位段時應格外小心。在訪問或修改位段的值時,可能需要使用位操作(如按位與、按位或、位移等)來確保數據的正確性。
可移植性由于位段的行為可能因編譯器和平臺而異,因此在使用位段時應考慮代碼的可移植性。如果可能的話,最好避免在需要跨平臺兼容性的代碼中使用位段。

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

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

相關文章

Swift 請求用戶授權以跟蹤其跨應用或網站的活動

步驟1:導入框架 首先,需要在Swift文件中導入AppTrackingTransparency框架。 import AppTrackingTransparency import AdSupport步驟2:請求跟蹤許可 在適當的地方請求用戶的跟蹤許可。通常,這個請求會在應用啟動時或者在用戶執行某些操作(例如,訪問應用中的廣告相關功能…

Linux服務器安裝docker,基于Linux(openEuler、CentOS8)

本實驗環境為openEuler系統(以server方式安裝)(CentOS8基本一致,可參考本文) 目錄 知識點實驗 知識點 Docker 是一個開源的應用容器引擎。它允許開發者將應用及其所有依賴項打包到一個可移植的容器中,并發布到任何支持Docker的流行Linux或Wi…

基于python flask的web服務

基本例子 from flask import Flask app Flask(__name__) app.route(/)#檢查訪問的網址,根路徑走這里 def hello_world():return hello world#返回hello worldif __name__ __main__:# 綁定到指定的IP地址和端口app.run(host0.0.0.0, port1000, debugTrue)##綁定端…

設計一個完美的用戶角色權限表

設計一個完美的用戶角色權限表需要考慮系統的安全性、靈活性和可擴展性。以下是一個詳細的用戶角色權限管理表設計方案,包含多個表結構和字段描述。 目錄 1. 用戶表(Users Table)2. 角色表(Roles Table)3. 權限表&…

【數據結構與算法 | 基礎篇】環形數組模擬隊列

1. 前言 上文我們用環形單向鏈表實現了隊列.接下來我們用環形數組來模擬隊列.并實現了isFull()&#xff0c;isEmpty()等方法. 2. 環形數組模擬隊列 (1). Queue接口 : public interface Queue<E> {//向隊伍插入值, 插入成功返回true, 否則返回falseboolean offer(E v…

【Linux】TCP協議【上】{協議段屬性:源端口號/目的端口號/序號/確認序號/窗口大小/緊急指針/標記位}

文章目錄 1.引入2.協議段格式4位首部長度16位窗口大小32位序號思考三個問題【demo】標記位URG: 緊急指針是否有效提升某報文被處理優先級【0表示不設置1表示設置】ACK: 確認號是否有效PSH: 提示接收端應用程序立刻從TCP緩沖區把數據讀走RST: 對方要求重新建立連接; 我們把攜帶R…

windows 設置系統字體 (win11 win10)

由于微軟的字體是有版權的&#xff0c;所以我打算替換掉 1.下載替換工具 github的項目&#xff0c;看起來很多人對微軟默認字體帶版權深惡痛絕。 項目地址&#xff1a;nomeiryoUi地址 這里選取最新的版本即可 2.打開軟件 這里顯示標題欄不能改&#xff0c;確認&#xff0c;其…

蓋雅技能發展云,助力制造企業人效合一

制造行業盡管經歷多次變革&#xff0c;但企業對人的管理始終是一項高度依賴經驗和耗費人力的工作。隨著供應鏈管理和生產設備的自動化、數字化升級&#xff0c;如何將第一生產要素——人&#xff0c;通過數字化的工具融入制造過程的閉環&#xff0c;對企業實現自動化工廠和智能…

力扣 滑動窗口題目總結

Leetcode3.無重復字符的最長子串 思路&#xff1a; 這道題主要用到思路是&#xff1a;滑動窗口 什么是滑動窗口&#xff1f; 其實就是一個隊列,比如例題中的 abcabcbb&#xff0c;進入這個隊列&#xff08;窗口&#xff09;為 abc 滿足題目要求&#xff0c;當再進入 a&#x…

牛客NC334 字典序第K小【困難 10叉樹 Java/Go/PHP/C++】,力扣 440. 字典序的第K小數字

題目 題目鏈接&#xff1a; https://www.nowcoder.com/practice/670c2bda374241d7ae06ade60de33e8b https://leetcode.cn/problems/k-th-smallest-in-lexicographical-order/description/ 本答案核心 10叉樹, 數學規律Java代碼 import java.util.*;public class Solution {…

大模型的靈魂解讀:Anthropic AI的Claude3 Sonnet可解釋性研究

大模型技術論文不斷&#xff0c;每個月總會新增上千篇。本專欄精選論文重點解讀&#xff0c;主題還是圍繞著行業實踐和工程量產。若在某個環節出現卡點&#xff0c;可以回到大模型必備腔調重新閱讀。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;則提供了大模型領域最新技…

Vue集成Iframe

一、應用場景&#xff0c;為什么要集成Iframe&#xff1f; 1、龐大項目拆分后&#xff0c;便于管理和部署&#xff0c;用集成Iframe的方法合并 2、避免功能重復開發&#xff0c;共用模塊可單獨開發為一個項目&#xff0c;既可獨立部署&#xff0c;也可集成到中臺系統 二、集成…

[算法][前綴和] [leetcode]724. 尋找數組的中心下標

題目地址 https://leetcode.cn/problems/find-pivot-index/description/ 題目描述 代碼 class Solution {public int pivotIndex(int[] nums) {int total Arrays.stream(nums).sum();//前綴和int prefixSum 0;int len nums.length;for(int i 0;i<len;i){if (i-1>0){p…

小豬APP分發:一站式托管服務,輕松玩轉應用市場

在當今移動應用爆炸式增長的時代&#xff0c;開發者們面臨的挑戰不再僅限于創意的火花和代碼的實現&#xff0c;更在于如何讓精心打造的應用快速觸達廣大用戶。這正是小豬APP分發www.appzhu.net應運而生的背景——作為一個全面、高效的APP托管服務分發平臺&#xff0c;它為開發…

基于PHP的物業管理的設計與實現

第1章 緒論... 1 1.1 研究背景與意義... 1 1.2 國內外發展現狀... 2 第2章 關鍵技術介紹... 3 2.1 PHP語言... 3 2.2 MySQL數據庫... 3 2.3 Zend框架... 4 2.4 B/S架構... 4 第3章 系統需求分析... 5 3.1 可行性分析... 5 3.1.1 技術可行性分析... 5 3.1.2 經濟可行…

解決Java中的IllegalArgumentException異常的正確方法

解決Java中的IllegalArgumentException異常的正確方法 引言 在Java編程中&#xff0c;IllegalArgumentException是一個常見的運行時異常&#xff0c;它通常在方法接收到不合法或不適當的參數時拋出。這篇文章將詳細介紹IllegalArgumentException異常的原因、如何診斷以及解決…

金職優學:分析央國企面試如何通關?

在當今競爭激烈的就業市場中&#xff0c;中央和國有企業&#xff08;以下簡稱“央國企”&#xff09;的面試機會對求職者來說是非常有吸引力的。這些企業通常擁有穩定的發展前景、良好的薪酬福利和廣闊的職業發展空間。但是&#xff0c;要想成功通過央國企的面試&#xff0c;求…

探索Python編程世界:從基礎到實戰

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、Python語言簡介與動態特性 代碼示例&#xff1a;動態類型與變量命名 二、Python應用領…

vue 表格表頭展示不下,顯示。。。;鼠標懸浮展示全部

vue 表格表頭展示不下&#xff0c;顯示。。。&#xff1b;鼠標懸浮展示全部 <templateslot-scope"scope"slot"header"><span:title"臨時證券類型"style"white-space:nowrap">{{ 臨時證券類型 }}</span></templa…

Terminal Web終端基礎(Web IDE 技術探索 二)

Terminal是web終端技術&#xff0c;類似cmd命令窗口&#xff0c;Webcontainer 中推薦使用的是Xterm.js&#xff0c;這里就不細說Xterm.js 的使用了&#xff0c;我們使用第三方庫來實現&#xff08;原生確實有點難用&#xff09;。 vue-web-terminal 一個由 Vue 構建的支持多內容…