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


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)

(個人意見。。。。。)





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM