c語言結構體的偏移、c++

c語言中關於結構體的位置偏移原則簡單,但經常忘記,做點筆記以是個記憶的好辦法

原則有三個:

a.結構體中的所有成員其首地址偏移量必須爲器數據類型長度的整數被,其中第一個成員的首地址偏移量爲0,

例如,若第二個成員類型爲int,則其首地址偏移量必須爲4的倍數,否則就要“首部填充”;以此類推

b.結構體所佔的總字節數即sizeof()函數返回的值必須是最大成員的長度的整數倍,否則要進行“末尾填充”;

c.若結構體A將結構體B作爲其成員,則結構體B存儲的首地址的偏移量必須爲B中所含成員數據長度最大值的整數倍,

如若B中成員爲int,double,char,則B的偏移量要爲8的整數倍;否則進行“中間填充”

---------------------------------------------------------------------------------------------------------------

關於c++/c中的sizeof

sizeof(a)返回的是a的類型數據所佔據的字節數,常見的數據類型字節數都比較好理解,列出一些比較特殊的以供參考:

1.當定義一個字符數組char a[](定義時必須賦值否則編譯不通過),且不顯示聲明該數組的長度時,該數組的長度爲你給他複製時的字符個數+1;

2.結構體中有關位置偏移,見上面;

3.所有指針類型的變量都佔4個字節;

4.自定義的類class如果不含任何成員則長度爲1;否則class和struct 的數據對齊原則一致;

5.sizeof()計算時只計算存放在棧中的空間,static等聲明的全局變量存放在靜態數據空間不會計算在內;

----------------------------------------------------------------------------------------------------------------

指針和數組名的區別:

定義一個指針char *a="abcd";定義一個數組char b[]="abcd";

則想得到字符‘b’時可以通過a[1]與b[1]得到,而且a和b都可以進行加減運算,這樣來看a與b的差別實在不明顯;但a與b的區別還是有,最典型的sizeof(a)=4(指針的空間);sizeof(b)=5(整個數組的空間);具體參照文章:http://wenku.baidu.com/view/678d1925a5e9856a561260b1.html

------------------------------------------------------------------------------------------------------------

sizeof()與strlen()的區別,列舉如下

1.前者可以用於大部分數據類型,後者只用於字符指針;

2.char a[]="abcd";則sizeof(a)=5;strlen(a)=4;char b[100]="abcd";sizeof(b)=100;strlen[b]=4;strlen在讀到'\0'結束符就停止計數;

3.char a[]={'a','b','c'},char b={'a','b','c','\0'};則sizeof(a)=3;strlen(a)=??(實驗了下等於5,不過不知道爲什麼??);sizeof(b)=4;strlen(b)=3;證明了第2點;而且注意下char a[]="abcd";和.char a[]={'a','b','c'}這兩種初始化方式的區別,前者會自動補上'\0'結束符,後者不會;

4,看到一句話說sizeof()是數符,而strlen是函數,對理解他們應該沒多大意義,可能在表達式中的地位有點區別;sizeof後面如果是變量名可以省括號,如果是類型名不能省;

---------------------------------------------------------------------------------------------------------------------------------------------

關於inline函數注意如下幾點:

1.inline函數的聲明如下:inline 函數聲明;

2.inline函數定義和聲明通常全部放在頭文件中,因爲inline函數會在編譯階段被替換爲函數代碼,不用到call/return機制,如果在一個.c中定義內聯函數,則在其他文件中無法用該函數;宏在編譯前處理(編譯預處理階段),inline在編譯階段處理;

3.inline函數和宏的區別在於inline函數在替換時會進行類型檢查,而且inline函數的聲明對於編譯器而言只是建議性的,編譯器會自身優化;

4.虛函數肯定不會是內聯函數,虛函數是在運行時決定調用哪個函數,而內聯函數在編譯階段就會被替換爲代碼塊,函數名符號根本就不存在了;

5.內聯函數的主要作用在於節約了資源,消除了一個call/return機制;

-----------------------------------------------------------------------------------------------

關於虛函數和純虛函數注意以下幾點:

1.虛函數的定義:virtue 函數聲明;純虛函數定義: virtue 函數聲明=0;

2.含有純虛函數的類叫做虛基類,這種類無法直接生成對象;

3.虛函數集中體現了繼承的多態性,及繼承自同一個基類的不同子類可以表現出不同的性質;虛函數是實用繼承:不僅繼承基類的接口,還繼承基類接口的初始功能,當然這些接口也可以在子類中重新自行定義;純虛函數只是繼承了基類的接口,要實現怎樣的功能都要在子類中定義;








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章