本文**:
第六章 預處理、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 語法的基本知識 如 不能以分號結束,括號的使用 要懂得預處理器將為你計算常數表示式的值,因此,寫出你是如何計算一年中有多少秒而不是計算出實際的值,會更有意義。最重要的是,意識到...