c struct 以及與之相關的一些其他小問題

2022-07-06 21:06:14 字數 2525 閱讀 6529

struct 是乙個簡單的型別,因為它是乙個值型別,struct又是乙個複雜的型別,因為它裡面又可以巢狀很多的其它型別,裡面的其他型別又可以包括比如struct之類的型別,所以說struct這個東西還是乙個很有趣的東西。

(首先宣告:環境vs2010 cpp檔案,推論以這個編譯器為基礎)

1 值型別和引用型別

這個乙個老生常談,面試必問,好像不問你就顯不出面試官的水平,也顯不出面試者的水平,反正5年了吧,我所面試的每次都會被問到這個問題,然後我就說struct是值型別,class是引用型別。

(停!stop!說的是毛啊,這誰都知道,誰都知道的你唧唧歪歪什麼,我上高中,哦不,上大學大一的時候課本上就寫了,struct是值型別,class是引用型別,說點有用的!)

好,說點有用的,(以下是引用clr via c# 那本書的內容)

值型別和引用型別都需要在堆疊上分配,對值型別的操作是乙個複製過程,複製完是兩個東西,引用型別是相當於指標,所有的都指向乙個東西,不管你引用幾次,他們最終都是乙個東西,順便說一句,裝箱和拆箱,裝箱是先分配乙個記憶體,然後把值型別放進去,這時候的值型別的生命週期已經變了, 隨著裝箱的生命週期而變動,拆箱是進行乙個複製的過程,複製值,然後銷毀記憶體,雖然都耗費效能,但是,拆箱要比裝箱低得多!over

說值型別和引用型別也很無趣,我覺得乙個程式設計師,拉風的程式設計師,誰會刻意的去玩命的裝箱拆箱,扯淡呢!(個人意見)

2  struct 的內部的一些問題

簡單的乙個stuct

structa;

void

main()

結果顯示1,為何他是1,不應該是空嘛?

(之所以強調是vs2010,因為在c檔案中編譯不通過,在linux下c檔案和cpp檔案中顯示的也不一樣,所以一開始就強調環境)

因為乙個空結構,即使沒有內部成員,但是必須在記憶體上有所體現,不然在取位址的時候就出問題了

繼續,

struct

aa();

~a;};

void

main()

a()是預設建構函式,即使你不寫,他也是隱藏存在的,除了我自己寫的,還有乙個a(const a&) 這個是拷貝建構函式

參考這個,我不是很了解,因為確實沒怎麼用過,悲催

3 再換個話題,struct的對齊方式

struct

sa ;

struct

sb ;

void

main()

結果 8  16,

long型別是4位元組,char是1位元組,乙個stuct以最大的長度作為對齊方式,也就是擺放的其實是這樣

1---

----

char佔了1個,後面補充了沒用的三個,long佔四個,所以整個就是8個

假如是這樣,

struct

sa ;

sizeof sa還是8個,因為2個char連續,char a後面有三個位元組,char c用乙個就夠了,還空出來兩個,假如是這樣

struct

sa ;

long double 佔8個,char 佔1個  int佔4個,(剩餘3個位元組)int 佔4個,空間不夠了,int d 會另起一行,而不是d在c後面填充乙個,第二行填充三個,

14---

4----

8

struct

sa ;

是這樣麼個擺放方式!以上兩段**的sizeof是一樣的

sb裡,也一樣char佔四個,int佔四個,sa佔8個,加起來是16個

然後,又來了乙個問題,sa裡的八個是整體算八個,還是拆開為char 和long 各自佔4個總共8個呢!

做個測試:

#include#include

struct

sa ;

struct

sb ;

void

main()

struct中假設sa整體佔八個,那麼3個char+乙個int+1個char總共是8個,sa佔8個,那就應該是16!

測試結果是20,也就是3個char 佔4個,乙個int 佔4個,乙個char佔4個,sa佔8個!也就是說 sa並不是整體算八個,而是相當於這樣的擺放方式

struct

sb ;

然後問題又來了!

按照這個擺放方式,應該是

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)

(個人意見。。。。。)

C struct與class的區別

c 中的struct對c中的struct進行了擴充,它不再只是乙個包含不同資料型別的資料結構,它已經獲取了太多的功能。struct能包含成員函式,struct能繼承,struct能實現多型。1 關於使用大括號初始化 如果定義了建構函式,class和struct都不能用大括號進行初始化。如果沒有定義建...

C struct與class 的區別

c 中的struct對c中的struct進行了擴充,考慮到 對c相容 就將struct保留了下來,並做了一些擴充套件使其更適合物件導向。它已經不再只是乙個包含不同資料型別的資料結構了,它已經獲取了太多的功能。1.預設訪問控制不同 struct 與 class最本質的乙個區別就是預設的訪問控制。在預設...

C struct與class的區別

來自 c 中的struct對c中的struct進行了擴充,它已經不再只是乙個包含不同資料型別的資料結構了,它已經獲取了太多的功能。struct能包含成員函式嗎?能!struct能繼承嗎?能!struct能實現多型嗎?能!既然這些它都能實現,那它和class還能有什麼區別?最本質的乙個區別就是預設的訪...