結構是一些值的集合,這些值稱為成員變數。結構的每個成員可以是不同型別的變數。
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...