c++中sizeof()的用法介紹

來源:互聯網
上載者:User

標籤:struct   return   傳回值   實值型別   不同的   介紹   tor   種類型   long   

1.      定義

sizeof是一個操作符(operator)。

其作用是返回一個對象或類型所佔的記憶體位元組數。

 

2.      文法

sizeof有三種文法形式:

1)  sizeof (object);  //sizeof (對象)

2)  sizeof object;   //sizeof 對象

3)  sizeof (type_name);  //sizeof (類型)

對象可以是各種類型的變數,以及運算式(一般sizeof不會對錶達式進行計算)。

sizeof對對象求記憶體大小,最終都是轉換為對對象的資料類型進行求值。

sizeof (運算式); //值為運算式的最終結果的資料類型的大小

 

舉例:

int i;  sizeof(int); //值為4  sizeof(i); //值為4,等價於sizeof(int)  sizeof i; //值為4  sizeof(2); //值為4,等價於sizeof(int),因為2的類型為int  sizeof(2 + 3.14); //值為8,等價於sizeof(double),因為此運算式的結果的類型為double  char ary[sizeof(int) * 10]; //OK,編譯無誤

 

 

1.      基礎資料型別 (Elementary Data Type)的sizeof

這裡的基礎資料型別 (Elementary Data Type)是指short、int、long、float、double這樣的簡單內建資料類型。

由於它們的記憶體大小是和系統相關的,所以在不同的系統下取值可能不同。

 

2.      結構體的sizeof

結構體的sizeof涉及到位元組對齊問題。

為什麼需要位元組對齊?電腦群組成原理教導我們這樣有助於加快電腦的取數速度,否則就得多花指令周期了。為此,編譯器預設會對結構體進行處理(實際上其它地方的資料變數也是如此),讓寬度為2的基礎資料型別 (Elementary Data Type)(short等)都位於能被2整除的地址上,讓寬度為4的基礎資料型別 (Elementary Data Type)(int等)都位於能被4整除的地址上,依次類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的sizeof值就增長了。

位元組對齊的細節和編譯器的實現相關,但一般而言,滿足三個準則:

1)  結構體變數的首地址能夠被其最寬基本類型成員的大小所整除。

2)  結構體的每個成員相對於結構體首地址的位移量(offset)都是成員大小的整數倍,如有需要,編譯器會在成員之間加上填充位元組(internal adding)。

3)  結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要,編譯器會在最末一個成員後加上填充位元組(trailing padding)。

 

    注意:空結構體(不含資料成員)的sizeof值為1。試想一個“不佔空間“的變數如何被取地址、兩個不同的“空結構體”變數又如何得以區分呢,於是,“空結構體”變數也得被儲存,這樣編譯器也就只能為其分配一個位元組的空間用於佔位了。

 

例子:

  1. struct S1  {      char a;      int b;  };  sizeof(S1); //值為8,位元組對齊,在char之後會填充3個位元組。    struct S2  {      int b;      char a;  };  sizeof(S2); //值為8,位元組對齊,在char之後會填充3個位元組。    struct S3  {  };  sizeof(S3); //值為1,空結構體也占記憶體

3.      聯合體的sizeof

結構體在記憶體組織上市順序式的,聯合體則是重疊式,各成員共用一段記憶體;所以整個聯合體的sizeof也就是每個成員sizeof的最大值。

 

例子:

  1. union u  {      int a;      float b;      double c;      char d;  };    sizeof(u); //值為8  

     

4.      數組的sizeof

數組的sizeof值等於數組所佔用的記憶體位元組數。

注意:1)當字元數組表示字串時,其sizeof值將’/0’計算進去。

            2)當數組為形參時,其sizeof值相當於指標的sizeof值。 

例子1:

  1. char a[10];  char n[] = "abc";     cout<<"char a[10]                 "<<sizeof(a)<<endl;//數組,值為10    cout<<"char n[] = /"abc/"           "<<sizeof(n)<<endl;//字串數組,將‘/0‘計算進去,值為4

 例子2:

  1. void func(char a[3])  {      int c = sizeof(a); //c = 4,因為這裡a不在是數群組類型,而是指標,相當於char *a。  }    void funcN(char b[])  {      int cN = sizeof(b); //cN = 4,理由同上。  } 

5.      指標的sizeof

指標是用來記錄另一個對象的地址,所以指標的記憶體大小當然就等於電腦內部地址匯流排的寬度。

在32位電腦中,一個指標變數的傳回值必定是4。

指標變數的sizeof值與指標所指的對象沒有任何關係。

  例子:

  1. char *b = "helloworld";  char *c[10];  double *d;  int **e;  void (*pf)();      cout<<"char *b = /"helloworld/"     "<<sizeof(b)<<endl;//指標指向字串,值為4  cout<<"char *b                    "<<sizeof(*b)<<endl; //指標指向字元,值為1  cout<<"double *d                  "<<sizeof(d)<<endl;//指標,值為4  cout<<"double *d                  "<<sizeof(*d)<<endl;//指標指向浮點數,值為8  cout<<"int **e                  "<<sizeof(e)<<endl;//指標指向指標,值為4  cout<<"char *c[10]                "<<sizeof(c)<<endl;//指標數組,值為40  cout<<"void (*pf)();              "<<sizeof(pf)<<endl;//函數指標,值為4  

     

6.      函數的sizeof

sizeof也可對一個函數調用求值,其結果是函數傳回值類型的大小,函數並不會被調用。

對函數求值的形式:sizeof(函數名(實參表))

注意:1)不可以對傳回值類型為空白的函數求值。 

            2)不可以對函數名求值。

           3)對有參數的函數,在用sizeof時,須寫上實參表。

 例子:

  1. #include <iostream>  using namespace std;    float FuncP(int a, float b)  {      return a + b;  }    int FuncNP()  {      return 3;  }    void Func()  {  }    int main()  {  cout<<sizeof(FuncP(3, 0.4))<<endl; //OK,值為4,sizeof(FuncP(3,0.4))相當於sizeof(float)  cout<<sizeof(FuncNP())<<endl; //OK,值為4,sizeof(FuncNP())相當於sizeof(int)  /*cout<<sizeof(Func())<<endl; //error,sizeof不能對傳回值為空白類型的函數求值*/  /*cout<<sizeof(FuncNP)<<endl; //error,sizeof不能對函數名求值*/  return 0;  }  

     

 

c++中sizeof()的用法介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.