關於sizeof的一點理解

2022-04-05 17:32:49 字數 1486 閱讀 1065

不小心看到網上很多關於sizeof的是表示式還是運算子之類的爭論。

其實lz也沒法給出相應的結論。還是就說說它的特性跟用法吧!

一、sizeof是在編譯的時候就計算所佔的空間大小,也就是說在給定的表示式必須在編譯的時候就知道其大小(型別名則在編譯的時候知道其大小)。既然是在編譯的時候就知道其大小,那麼sizeof裡面的表示式或者通過某種方式獲取到對應的型別名的過程,在執行過程中就不再進行運算。

比如:int a = 10; sizeof(++a); 在程式跑過sizeof(++a)的時候其實a還是等於10

二、關於計算的大小這個得看你的表示式或者型別名所佔的空間大小。

比如:int* p = new int[100]; sizeof(p) == 4;  因為p的型別是int* 佔4個位元組。而不是new出來的100*sizeof(int)

int* p[100]; sizeof(p) == 100*sizeof(int*)  這裡其實可以看出p的型別是 int*(&)[100] 所以很簡單的就可以知道所佔據的空間大小了。

關於計算結構體的大小涉及的方面就比較多了(對齊等)這裡就不多介紹了。

三、關於msdn給出的   

sizeof unary-expression

sizeof ( type-name )

說明如果是一元表示式則不能加括號。如果是型別名則加括號。

1、關於最簡單的 int a; 為什麼sizeof(a)也合法 sizeof a 也合法呢?這裡咱們可以發現編譯器可以自然地識別出a是int型別所以說它是型別名,但是從另乙個角度分析也可以說它是表示式:很通俗的乙個說法就是你在程式的隨便一行可以這麼寫:a;雖然a不做任何處理但是編譯器卻把它看成是一行語句。所以在這裡使用sizeof(a) 跟 sizeof a都是沒有問題。

2、網上經常給出的sizeof(int) 這個要加括號但是總是沒給出原因。其實這裡的int它是型別名,卻無法把它當做乙個表示式,所以它就必須加括號。如果咱們這樣子寫 sizeof(int()) 那麼就會編譯出錯。因為int()現在被當成了表示式,但不是型別名。因為int() 表示式的結果程式無法正常推出來是什麼型別,如果說可以正常推出來那麼char()它也應該要推出來是char型別,更一般的情況假設有乙個結構體struct node{};那麼它應該也要推出來node()是node型別。但是編譯器對於表示式推斷結構體型別目前是無法做到的。所以編譯器也不會對特化的表示式(char()、int()等等)進行相應的推斷它的型別名。雖然sizeof(node)和sizeof node() 返回的結果是一樣大的。

3、lz在測試的過程中發現struct node }; 這樣在執行 sizeof node;按照正常的推理,把node當成乙個表示式。既然是表示式的話它需要乙個引數,但是結構體卻沒有提供,理論上應該編譯不通過的。但是真正編譯的時候卻沒有報錯。我們知道如果給定了建構函式,編譯器就不會再自動生成對應預設建構函式。那麼編譯器是如何確定它是乙個表示式的呢?lz這裡也不清楚。有乙個牽強的解釋是:編譯器底層已經預設宣告了無參的建構函式。當然這個只是猜測,路過的希望能提點一下。

關於sizeof()和strncpy的一點小體會

關於今天在論壇裡請教sizeof 的問題,有以下收穫 身邊的強人都去參加博創比賽去了,只能到論壇裡問了 1 sizeof 不是函式,是運算子 2 陣列和指標陣列的長度是不一樣的 如果是char m liudehua sizeof m 4 如果是char m 120 liudehua sizeof m...

關於malloc的一點理解

在函式中使用malloc,如果是大的記憶體分配,而且malloc與free的次數也不是特別頻繁,使用malloc與free是比較合適的,但是如果記憶體分配比較小,而且次數特別頻繁,那麼使用malloc與free就有些不太合適了。因為過多的malloc與free容易造成記憶體碎片,致使可使用的堆記憶體...

關於HTTPS的一點理解

通訊使用明文 不加密 內容可能會被竊聽。不驗證通訊方的身份,因此有可能遭遇偽裝。無法證明報文的完整性,所以有可能已經遭到篡改。https http 認證 加密 完整性保護 https是與ssl 安全套接層 組合使用的http協議 http secure 使用ssl之後,請求則變成先和ssl通訊,ss...