天若不愛酒,酒星不在天。結構體解析

2021-10-04 01:19:05 字數 2426 閱讀 8550

結構是一些值的集合,這些值稱為成員變數。結構的每個成員可以是不同型別的變數。

struct tag //結構體標籤 variable-list ;

//結構變數

結構的成員可以是標量、陣列、指標、甚至是其他結構體。

struct pointp1;

//宣告型別的同時定義變數p1

//初始化:定義變數的同時賦初值。

struct point p3 =

;

首先掌握結構體的對齊規則:

第乙個成員在與結構體變數偏移量為0的位址處。

其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。

對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。 vs中預設的值為8 linux中的預設值為4

結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。

如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。

結構體內存對齊練習:

struct s1

;printf

("%d\n"

,sizeof

(struct s1));

// 12

struct s2

;printf

("%d\n"

,sizeof

(struct s2));

// 8

struct s3

;printf

("%d\n"

,sizeof

(struct s3));

//結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。2 * 8,16

struct s4

;printf

("%d\n"

,sizeof

(struct s4));

//結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。 16 * 2 ,32

為什麼要存在記憶體對齊?

1.平台原因(移植原因): 不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。

2.效能原因: 資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。

3.結構體的記憶體對齊是拿空間來換取時間的做法。

struct s

;struct s s =

,1000};

//結構體傳參

void

print1

(struct s s)

//結構體位址傳參

void

print2

(struct s* ps)

intmain()

結論:函式傳參的時候,引數是需要壓棧的。如果傳遞乙個結構體物件的時候,結構體過大。引數壓棧得系統開銷比較大,所以會導致效能下降。結構體傳參的時候,要傳結構體的位址。

位段的宣告和結構是類似的,有倆個不同點:

1.位段的成員必須是int 、unsigned int、signed int。

2.段位的成員名後邊有乙個冒號和乙個數字。

比如

struct a

;

a就是乙個位段,a的大小是多少?8

printf

("%d\n"

,sizeof

(struct a));

//int 型具有四個位元組,共32個位元位,故儲存時將前三個放入第一塊空間中,由於第四個是30個位元位儲存不下,因此開闢下一快空間儲存,即開闢了兩快空間,就是好8個位元組。其他型別同理可得。

位段的記憶體分配

1.位段的成員可以是int 、unsigned int、signed int、char(屬於整形家族)型別。

2.位段的空間上是按需要以4個位元組或者1個位元組的方式來開闢。

3.位段涉及很多不確定的因素,位段是不跨平台的,注重可移植的程式應該避免使用位段。

位段的跨平台問題

1.int 位段被當成有符號數還是無符號數是不太確定的。

2.位段中最大的數目不確定。(16位機器最大16,32位機器最大32,寫成27,在16位機器會出問題)

3.位段中的成員在記憶體中從右向左分配,還是從右向左分配標準尚未定義。

4.當乙個結構包含倆個位段,第二個位段成員比較,無法容納於第乙個位段剩餘的位時,是捨棄剩餘的位還是利用,這是不確定的。

java實現分酒(泊松分酒)

寫在前面 泊松分酒 法國著名數學家波瓦松在青年時代研究過乙個有趣的數學問題 假設某人有12品脫的啤酒一瓶,想從中倒出六品脫,但是恰巧身邊沒有6品脫的容器,僅有乙個8品脫和乙個5品脫的容器,怎樣倒才能將啤酒分為兩個6品脫呢?現在,請你設計乙個程式,可以根據輸入的滿瓶容量 a 和兩個空瓶的容量 b和c ...

出彩人生酒業 我們只是酒的釀造者

作為中國特有的一種純糧釀造酒,白酒在我國已有千年歷史。悠長的歷史,厚重的文化積澱,都使白酒行業在歷史的發展程序中不斷衍生壯大。相較於機械化釀造,傳統手工釀造對體力與技術的要求更高。除了需要極大的體力之外,看氣上甑需講究 輕 松 勻 平 準 薄,涼糟下曲需要對溫度 濕度 酸度進行精準控制 這些工序都離...

藍橋杯 分酒

泊松是法國數學家 物理學家和力學家。他一生致力科學事業,成果頗多。有許多著名的公式定理以他的名字命名,比如概率論中著名的泊松分布。有一次閒暇時,他提出過乙個有趣的問題,後稱為 泊松分酒 在我國古代也提出過類似問題,遺憾的是沒有進行徹底探索,其中流傳較多是 韓信走馬分油 問題。有3個容器,容量分別為1...