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