預處理 const與sizeof

2021-06-09 03:19:55 字數 2061 閱讀 4853

本文**:

第六章 預處理、const與sizeof

1. 預處理當中的巨集定義

注意:有時候巨集展開以後會出現二意性問題。所以要注意使用括號。

2. sizeof的總結

sizeof是運算子,它的作用是返回乙個型別或變數的長度,長度的單位是位元組。

(1)基本資料型別sizeof的結果

平台:windows xp,32位cpu;

* vc++6.0.

使用.c和.cpp作為檔案字尾得到的結果是同樣的.(有的程式同樣是在vc++6.0下,字尾名不同,用的編譯器不同,結果也不同。譚浩強的c語言第二版上的有個union型別的例題就是這樣,用.c就可以編譯通過,用.cpp作為字尾,就有錯誤。)

* turbo c下的結果是不相同的。int型別是2,long double是10.

(2)結構體的sizeof問題(資料對齊問題)

為了方便對結構體內元素的訪問和管理,以結構體裡面最長的資料元素的長度為對齊單位,也就是說,結構體的長度一定是最長元素的整數倍。(不管結構體內的元素是大於還是小於處理器的位數)。這點跟書上的不同。書上的經過vc++驗證,反正在vc++下是錯的。並且最大的單位就是8個位元組,即使結構體中有其他結構體的變數,也最大是以8個位元組為單位對齊的。8位元組是基本資料型別中佔空間最大的單位。

結構體內小於最長元素的元素,如果是單獨的,則占用乙個最長單位;如果有幾個連續的放在一起的,可以按最長單位順序存放。知道滿了或者剩下的不夠超出為止,即換到下乙個最長長度單位。

例1:struct tagd

;結果為: 。以8個位元組為單位,不足8的補齊。第乙個short佔2個,但是後面緊跟著是double佔8個位元組,所以讓第乙個short佔8個位元組,接下來double再佔8個位元組。最後乙個short一樣處理,不足8補成8個位元組。

例2struct tagd

;結果為: 。以8為單位,後面的兩個short加起來只佔4個,不夠8個單位,所以一共是2個8位元組,一共是16.

對於結構體中的位運算中的位段,是以4位元組,即int所佔位元組的大小為單位對齊的。如果位段結構體中還有其他型別,那麼同樣是以最大位元組數為對齊單位。

(3)對類sizeof

1.       空類佔1個位元組;

2.       類中的成員函式不計算在內,只計算成員變數佔多少個位元組;

3.       靜態成員變數不計算在內,因為靜態成員變數存放在全域性資料區,而sizeof是計算棧中分配的大小。

4.       如果有虛函式或者純虛函式的話,不管有多少個,只增加4個位元組,這四個位元組是虛函式表的指標所佔的空間。

5.       多重繼承的話也不會增加所佔位元組數;

6.       虛繼承,會增加4個位元組。

7.       虛繼承有虛函式的類,那麼新類增加4+4個位元組。如果自己還有虛函式,則再增加4個位元組。

8.       但非虛繼承有虛函式的類,新類增加4個位元組,而且即使自己還有虛函式,也不再增加額外的4個位元組。說明它們用的是同乙個虛函式表。

(注)以上提及的增加,對於空類來說,只是由1個位元組變為,而不是在1上增加。

例:class a

;class a2

;class b

;class b2

;class c: public a

;class d: public virtual a

;class e: public a,public a2

;class f1: public virtual b

;class f2: public virtual b

;class g1: public b

;class g2: public b

;void main(void)

(4)對陣列名sizeof(退化為指標的問題)

等於將其元素型別做sizeof的結果×陣列元素的個數。

而當陣列名作為函式引數時,有個退化的問題。即在函式內部用sizeof(陣列名),則得到是乙個指標的大小,即4位元組,非上面資料型別×陣列元素的個數。

例:char var[10];

int test(char var)

cout<

cout<

返回的是4,而非10. 執行結果為:

預處理 const 與 sizeof

程式設計師面試寶典 第二版筆記 巨集定義1.用乙個巨集定義find求乙個結構體struct裡任意變數相對struct的偏移量 struct student 則find student,a 等於0 find student,b 等於4 答 define find struc,e size t stru...

預處理 const與sizeof

程式設計師面試寶典 1 預處理指令 define宣告乙個常數,用以表明1年中有多少秒 define second per year 60 60 24 365ul define 語法的基本知識 不能以分號結束 預處理將會計算常數表示式的值,寫出如何計算一年中有多少秒而不是計算出實際的值更有意義 有可能...

預處理與const

1.1 巨集定義 例題1 用預處理指令 define 宣告乙個常數,用以表明1年中有多少秒 忽略閏年問題 解析 defne 語法的基本知識 如 不能以分號結束,括號的使用 要懂得預處理器將為你計算常數表示式的值,因此,寫出你是如何計算一年中有多少秒而不是計算出實際的值,會更有意義。最重要的是,意識到...