看了幾遍 sizeof 的內容,老是忘記,這裡做下筆記,以供複習與參考。
sizeof(a)用來計算a所佔位元組大小,其中a可以是型別名,也可以是變數,亦或是物件、函式。
1) sizeof (int); //型別
2) sizeof (a); //int a;變數
3) sizeof (a); //class a; a a;物件
4) sizeof(function_name);//計算的是函式返回型別的值
在計算結構體大小時,由於位元組對齊的緣故,需要考慮3個準則(後面有示例):
1.計算前,注意首位址——保證結構體的首位址能被最寬的基本型別成員大小所整除(除非給定了首位址,否則預設首位址為0)。
2.計算時,注意成員偏移量——保證每個成員相對首位址的偏移量是該成員大小的整數倍(注意這裡的成員是指此時正在計算的成員,而不是最寬基本型別成員)。
3.計算後,注意總體大小——結構體的總大小應該是結構體中最寬基本型別成員大小的整數倍。
另外,需要注意以下3個問題:
1.上述中說的是都是基本型別,即char(1),short(2),float(4),int(4),double(8),對於結構體巢狀的情況,比如:
struct s
;//s結構體大小為24
struct b
;
其中結構體b中巢狀了s,而且s的大小比其他基本型別的大小都大,但我們在計算b的大小時只能按照最寬的基本型別計算(這裡是double),而不是按照s的大小作為最寬大小。
3.結構體中,如果定義順序不同,會影響結構體的總體大小,如:——這裡是計算示例
struct s1
;//我們按照上面說的三步走
//1.計算前,首位址為最大基本型別的整數倍,一般預設從0開始,0整除4,沒毛病。
//計算a時,由於0可以整除2,故a從0開始,佔2個位元組-[0,2)
//計算b時,參考準則2,由於2不能整除4,需要在a的後面補2個位元組,然後b從4開始,佔4個位元組-[4,8)
//計算c時,由於8可以整除2,因此不需要補齊位元組,所以c從8開始,佔2個位元組-[8,10)
//3.計算後,上述算的的總體大小為10,根據準則3,總體大小應為最大基本型別(這裡是int)的整數倍,因此這裡需要補2個位元組,所以,最後總體大小為12.
struct s2
//通過上述方法可算得,s2的大小為8
所以我們在計算結構體大小時,應按照定義順序計算。
4.變長結構體不能使用sizeof計算
另外需要注意的是sizeof是關鍵字,不是函式,它是在編譯時計算的,所以他只會算實際分配的記憶體大小,而不管你用了多少(用了多少是你執行之後確定的),也因此它不能計算動態分配的記憶體大小。反觀strlen,他是乙個函式,用來計算字串的長度,遇到『\0』結束。函式是在執行時起作用的,所以他計算的是實際有多少記憶體(以』\0』為界)。
另外,可以通過
#pargma push pack(n)
來設定對齊規則 一看就懂的SwitchHosts
switchhosts 是乙個管理 切換多個 hosts 方案的工具。它是乙個免費開源軟體。日常開發工作中,我們可能經常需要切換各種 hosts 繫結,比如在本地開發時可能需要乙個開發環境的 hosts 繫結方案,發布到測試環境後又有乙個測試環境的 hosts 繫結方案,然後可能還有乙個預發布環境,...
一看就懂TCP 連線
我們先來看乙個定義。這樣理解比較抽象。我們換個角度。它的本質還是傳輸控制。如果讓我們自己設計這個傳輸,我們會怎麼想呢。tcp 協議它會先建立連線。三次握手目的是保證雙方都有傳送和接收的能力 首要原因是為了防止舊的重複連線初始化造成混亂。同步雙方初始序列號客戶端和服務端都處於 closed 狀態。先是...
資訊熵 一看就懂
先給出資訊熵的公式 首先了解一下資訊量 資訊量是對資訊的度量,就跟時間的度量是秒一樣,當我們考慮乙個離散的隨機變數 x 的時候,當我們觀察到的這個變數的乙個具體值的時候,我們接收到了多少資訊呢?多少資訊用資訊量來衡量,我們接受到的資訊量跟具體發生的事件有關。資訊的大小跟隨機事件的概率有關。越小概率的...