C语言中的自定义类型
生活随笔
收集整理的這篇文章主要介紹了
C语言中的自定义类型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C語言中的自定義類型
(一)結構體
結構體是一些值的集合,這些值稱為成員變量,結構體的成員可以是不同類型的變量;
在聲明結構體的時候可以不完全的聲明,稱為匿名結構體,例如:
結構體的自引用使用指針
示例代碼如下:
結構體內存對齊的規則:
第一個成員在與結構體變量偏移量為0的地址處。
其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。
比特科技
對齊數 = 編譯器默認的一個對齊數 與 該成員大小的較小值。
結構體總大小為最大對齊數(每個成員變量都有一個對齊數)的整數倍。
如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是
所有最大對齊數(含嵌套結構體的對齊數)的整數倍。
為什么存在內存對齊?
什么存在內存對齊?
大部分的參考資料都是如是說的:
平臺原因(移植原因): 不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址
處取某些特定類型的數據,否則拋出硬件異常。
性能原因: 數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在于,為了訪問未對齊的內存,處理
器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。
總體來說:
結構體的內存對齊是拿空間來換取時間的做法。
修改默認對齊參數:
#pragma pack(n)
n為2^n;
(二)位段
什么是位段
位段的聲明和結構是類似的,有兩個不同:
1.位段的成員必須是int、unsigned int或 signed int
2.位段的成員名后邊有一個冒號和一個數字;
例如:
位段的內存分配:
位段的成員可以是 int unsigned int signed int 或者是 char (屬于整形家族)類型
位段的空間上是按照需要以4個字節( int )或者1個字節( char )的方式來開辟的。
位段涉及很多不確定因素,位段是不跨平臺的,注重可移植的程序應該避免使用位段。
3.位段的跨平臺問題:
int位段被當成有符號數還是無符號數是不確定的。
位段中最大位的數目不能確定。
位段中的成員在內存中從左往右還是從右往左分配標準尚未定義。
當一個結構體包含兩個位段,第一個位段成員比較大,無法容納于第一個位段時,是舍棄剩余位置還是利用,這是不確定的。
(二)枚舉
枚舉顧名思義就是一一列舉。
把可能的取值一一列舉。
上定義的 enum Day , 是枚舉類型。 {}中的內容是枚舉類型的可能取值,也叫 枚舉常量
這些可能取值都是有值的,默認從0開始,一次遞增1,當然在定義的時候也可以賦初值。
3. 枚舉的優點:
增加代碼的可讀性和可維護性
和#define定義的標識符比較枚舉有類型檢查,更加嚴謹。
防止了命名污染(封裝)
便于調試
使用方便,一次可以定義多個常量。
(三)聯合
聯合也是一種特殊的自定義類型 這種類型聯合也叫共用體)。 比如:聯合類型的定義聯合也是一種特殊的自定義類型 這種類型定義的變量也包含一系列的成員,特征是這些成員公用同一塊空間(聯合也叫共用體)。 比如:
聯合的成員是共用同一塊內存空間的,這樣一個聯合變量的大小,至少是最大成員的大小(因為聯合至少得有能力保存最大的那個成員)
當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大比如:聯合大小的計算聯合的大小至少是最大成員的大小。當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
總結
以上是生活随笔為你收集整理的C语言中的自定义类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch框架学习十五——可视化工具
- 下一篇: 数组与链表