struct 是一個簡單的類型,因為它是一個值類型,struct又是一個復雜的類型,因為它里面又可以嵌套很多的其它類型,里面的其他類型又可以包括比如struct之類的類型,所以說struct這個東西還是一個很有趣的東西。
(首先聲明:環境vs2010 cpp文件,推論以這個編譯器為基礎)
1 值類型和引用類型
這個一個老生常談,面試必問,好像不問你就顯不出面試官的水平,也顯不出面試者的水平,反正5年了吧,我所面試的每次都會被問到這個問題,然后我就說struct是值類型,class是引用類型。
(停!stop!說的是毛啊,這誰都知道,誰都知道的你唧唧歪歪什么,我上高中,哦不,上大學大一的時候課本上就寫了,struct是值類型,class是引用類型,說點有用的!)
好,說點有用的,(以下是引用clr via C# 那本書的內容)
值類型和引用類型都需要在堆棧上分配,對值類型的操作是一個復制過程,復制完是兩個東西,引用類型是相當於指針,所有的都指向一個東西,不管你引用幾次,他們最終都是一個東西,順便說一句,裝箱和拆箱,裝箱是先分配一個內存,然后把值類型放進去,這時候的值類型的生命周期已經變了, 隨着裝箱的生命周期而變動,拆箱是進行一個復制的過程,復制值,然后銷毀內存,雖然都耗費性能,但是,拆箱要比裝箱低得多!over
說值類型和引用類型也很無趣,我覺得一個程序員,拉風的程序員,誰會刻意的去玩命的裝箱拆箱,扯淡呢!(個人意見)
2 struct 的內部的一些問題
簡單的一個stuct
struct a { }; void main() { printf("%d",sizeof a); int d=0; scanf("%d",d); }
結果顯示1,為何他是1,不應該是空嘛?
(之所以強調是vs2010,因為在c文件中編譯不通過,在linux下c文件和cpp文件中顯示的也不一樣,所以一開始就強調環境)
因為一個空結構,即使沒有內部成員,但是必須在內存上有所體現,不然在取地址的時候就出問題了
繼續,
struct a { char x; char y; a(char a1,char a2) { x=a1; y=a2; }
a();
~a; }; void main() { printf("%d",sizeof a);
a fish('1','2'); int d=0; scanf("%d",d); }
a()是默認構造函數,即使你不寫,他也是隱藏存在的,除了我自己寫的,還有一個a(const a&) 這個是拷貝構造函數
http://www.cnblogs.com/ltang/archive/2010/10/08/1861145.html
參考這個,我不是很了解,因為確實沒怎么用過,悲催
3 再換個話題,struct的對齊方式
struct sa { char a; long b; }; struct sb { char a; int b; sa struct1; }; void main() { char *a="112312"; printf("%d\n",sizeof(sa)); printf("%d",sizeof(sb)); int d=0; scanf("%d",d); }
結果 8 16,
long類型是4字節,char是1字節,一個stuct以最大的長度作為對齊方式,也就是擺放的其實是這樣
1---
----
char占了1個,后面補充了沒用的三個,long占四個,所以整個就是8個
假如是這樣,
struct sa { char a; char c; long b; };
sizeof sa還是8個,因為2個char連續,char a后面有三個字節,char c用一個就夠了,還空出來兩個,假如是這樣
struct sa { char a; int c; int d; long double b; };
long double 占8個,char 占1個 int占4個,(剩余3個字節)int 占4個,空間不夠了,int d 會另起一行,而不是d在c后面填充一個,第二行填充三個,
14---
4----
8
struct sa { char a; int c; int d; int e; long double b; };
是這樣么個擺放方式!以上兩段代碼的sizeof是一樣的
sb里,也一樣char占四個,int占四個,sa占8個,加起來是16個
然后,又來了一個問題,sa里的八個是整體算八個,還是拆開為char 和long 各自占4個總共8個呢!
做個測試:
#include<stdio.h> #include<stdlib.h> struct sa { char a; long b; }; struct sb { char a; char b; char c; int d; char e; sa struct1; }; void main() { char *a="112312"; printf("%d\n",sizeof(sa)); printf("%d",sizeof(sb)); int d=0; scanf("%d",d); }
struct中假設sa整體占八個,那么3個char+一個int+1個char總共是8個,sa占8個,那就應該是16!
測試結果是20,也就是3個char 占4個,一個int 占4個,一個char占4個,sa占8個!也就是說 sa並不是整體算八個,而是相當於這樣的擺放方式
struct sb { char a; char b; char c; int d; char e; // sa struct1;//等同於 char a; long b; };
然后問題又來了!
按照這個擺放方式,應該是
111-(char a char b char c)
4 (int d)
11-- (chare char a)
4 (long b)
才對的啊,結果應該還是16才對!
因為sa 是一個整體,雖然可以寫成那種模式,但是他里面的元素要另起一行,不和其他的外部元素共用!
111-(char a char b char c)
4 (int d)
1--- (char e )
1--- ( char a)
4 (long b)
(個人意見。。。。。)