自定義資料型別
自定義資料型別
結構體
結構體的宣告
結構體的基礎知識
結構的宣告
變數的宣告
匿名結構型別
結構體的自引用
結構體變數的定義和初始化
結構體記憶體對齊
第一,第一個成員在偏移量為0的地方,我們假設第一個成員的記憶體在第二行開始
第二,其他成員要對齊到對齊數的整數倍,對齊數的概念如上圖,因為int a的位元組是4,vs預設對齊數是8,所以在這裡對齊數是4,4的整數倍是4,所以int a在第五行開始,也就是紫色的地方
第三,同第二理char c2的對齊數是1,那麼它就在9行,此時這個結構體一共佔了9個位元組
最後,結構體的總大小是最大對齊數的整數倍,在這裡也就是4的最大整數倍,因為此時已經佔了9個了,所以是12,所以這個結構體大小是12
很明顯,上面的規則中第四個沒有使用到,那麼結構體巢狀的問題是什麼樣呢
首先計算出結構體s3的大小是16
結構體s4中巢狀了s3
第一,結構體s4中第一個成員是char型別,佔一個位元組,如右上藍色
第二,巢狀的結構體對齊到自己的最大對齊數的整數倍,s3中最大對齊數是8,整數倍是8,所以從第八個位置開始,s3的大小已經計算出是16,佔16個位元組大小
第三,double型的佔8個位元組,所以向下佔8個位置,如右上紫色
最後,可以看出一共佔了32個位元組(中間紅色的是被浪費的)
但結構體的整體大小是最大對齊數(含巢狀結構體)的整數倍,結構體s4中的最大對齊數是結構體s3,也就是16,32是16的整數倍,所以結構體s4的大小是32
有的人可能會好奇,VS預設對齊數是8,那麼其他編譯器呢。這裡如果其他編譯器沒有預設對齊數,那麼該成員大小的最小值就是對齊數
那麼記憶體對齊會浪費空間為什麼要記憶體對齊呢
那在設計結構體的時候,既要滿足對齊,又要節省空間,應如何做
修改預設對齊數
#pragma pack(n)
這裡的n就是我們自己修改的預設對齊數
結構體成員偏移量
offsetof是個巨集,不是函式
offsetof–>標頭檔案#include<stddef.h>
結構體傳參
很顯然say2傳參方式更好,原因:
位段
什麼是位段
位段的記憶體開闢
一次開闢一個整形空間,這個整形空間4個位元組,32個bite位,a需要2個,b需要5個,c需要10個,這一個空間一共32個,但是已經使用了17個,剩下15個,不夠d使用了,那麼前面15個bite位全都丟掉,重新開闢一個整形空間,也就是4個位元組,32個bite位,然後使用30個bite位給d,剩下兩個丟掉,也就是說,這個位段一共使用了8個位元組
位段就是為了節省空間存在的
結構體的話要開闢四個位元組空間,但是位段只需要三個位元組空間
位段的弊端
位段不能跨平臺,可移植程式應避免使用位段
列舉
列舉的基本概念及使用
列舉也就是一一列舉
列舉的優點
聯合-聯合體(共用體)
聯合型別的定義
聯合的特點
判斷計算機的大小端儲存方式
所以如果想要判斷儲存方式(比如int a的儲存方式)是小端還是大端,就可以看第一個位元組(一個整型裡有4個位元組)是不是1
但這種方法不太好,我們可以自己封裝一個函式
也可以利用我們剛學到的聯合體的知識解決
聯合大小的計算
作者:呂文康
學校:山東第一醫科大學
2020年11月14日
相關文章
- DM自定義資料型別資料型別
- Vector中存放自定義資料型別資料型別
- 自主資料型別:在TVM中啟用自定義資料型別探索資料型別
- 自定義型別型別
- Python 多程式的自定義共享資料型別Python資料型別
- UnrealEngine建立自定義資產型別Unreal型別
- Kettle自定義資料庫連線型別連線HGDB資料庫型別
- 型別自定義格式字串型別字串
- ros|自定義訊息型別ROS型別
- Android 自定義構建型別 BuildTypeAndroid型別UI
- C# 泛型集合的自定義型別排序C#泛型型別排序
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- 兄弟連go教程(7)自定義型別Go型別
- C語言筆記——自定義型別C語言筆記型別
- Hive(一)資料型別以及DDL資料定義Hive資料型別
- ClickHouse資料庫資料定義手記之資料型別資料庫資料型別
- Jaskson精講第6篇-自定義JsonSerialize與Deserialize實現資料型別轉換JSON資料型別
- 編號函式 自定義函式 集合型別 表的優化 資料傾斜函式型別優化
- 如何構建自定義人臉識別資料集
- js資料型別之基本資料型別和引用資料型別JS資料型別
- 資料型別: 資料型別有哪些?資料型別
- Mybatis使用小技巧-自定義型別轉換器MyBatis型別
- 《Haskell趣學指南》筆記之自定義型別Haskell筆記型別
- ROS2/C++ 自定義訊息型別ROSC++型別
- PyTorch 自定義資料集PyTorch
- 多型關聯自定義的型別欄位的處理多型型別
- JAVASE——資料型別,變數定義及使用Java資料型別變數
- 第11章 使用類——型別轉換(二)將自定義型別轉換為內建型別型別
- 區別值型別資料和引用型別資料型別
- 還可以這麼玩?超實用 Typescript 內建型別與自定義型別TypeScript型別
- 一文說透WordPress的自定義文章型別型別
- HarmonyOS Next自定義資料型別的跨應用協作:實現企業級文件管理資料型別
- python 自定義資料分頁Python
- 資料型別,型別轉換資料型別
- 資料型別資料型別
- 自學java筆記I 基本型別+轉義字元+資料型別的轉換Java筆記字元資料型別
- JAVA中基本資料型別和引用資料型別Java資料型別
- 3. php資料型別、資料型別轉換PHP資料型別