天天看點

關于sizeof操作符的了解和總結

關于sizeof 運算符的總結:

先看一些别人的介紹總結:

1  .From: <<c++ primary 3rd Edition>>

siseof 操作符的作用是傳回一個對象或類型名的位元組長度它有以下三種形式

sizeof (type name );

sizeof ( object );

sizeof object;

傳回值的類型是size_t 這是一種與機器相關的typedef 定義我們可以在cstddef 頭文

件中找到它的定義下面的例子使用了sizeof 的兩種格式

#include <cstddef>

int ia[] = { 0, 1, 2 };

// sizeof 傳回整個數組的大小

size_t array_size = sizeof ia;

// sizeof 傳回int 類型的大小

size_t element_size = array_size / sizeof( int );

當sizeof 操作符應用在數組上時例如上面例子中的ia 它傳回整個數組的位元組長度

而不是第一個元素的長度也不是ia 包含的元素的個數例如在一台int 類型是4 個位元組

長的機器上sizeof 訓示ia 的長度是12 位元組類似地當我們寫如下代碼時

int *pi = new int[ 3 ];

size_t pointer_size = sizeof ( pi );

sizeof(pi)傳回的值是指向int 型的指針的位元組長度而不是pi 指向的數組的長度

下面的小函數可以用來練習sizeof()操作符

#include <string>

#include <iostream>

#include <cstddef>

int main()

{

size_t ia;

ia = sizeof( ia ); // ok

ia = sizeof ia; // ok

// ia = sizeof int; // 錯誤

ia = sizeof( int ); // ok

int *pi = new int[ 12 ];

cout << "pi: " << sizeof( pi )

<< " *pi: " << sizeof( *pi )

<< endl;

// 一個string 的大小與它所指的字元串的長度無關

string st1( "foobar" );

string st2( "a mighty oak" );

string *ps = &st1;

cout << "st1: " << sizeof( st1 )

<< " st2: " << sizeof( st2 )

<< " ps: " << sizeof( ps )

<< " *ps: " << sizeof( *ps )

<< endl;

cout << "short :/t" << sizeof(short) << endl;

cout << "short* :/t" << sizeof(short*) << endl;

cout << "short& :/t" << sizeof(short&) << endl;

cout << "short[3] :/t" << sizeof(short[3]) << endl;

}

編譯并運作它産生如下結果

pi: 4 *pi: 4

st1: 12 st2: 12 ps: 4 *ps: 12

short : 2

short* : 4

short& : 2

short[3]: 6

正如上面的例子程式所顯示的那樣應用在指針類型上的sizeof 操作符傳回的是包含該

類型位址所需的記憶體長度但是應用在引用類型上的sizeof 操作符傳回的是包含被引用對

象所需的記憶體長度

sizeof 操作符應用在char 類型上時在所有的C++實作中結果都是1

// 在所有的實作中保證為1

size_t char_size = sizeof( char );

sizeof 操作符在編譯時刻計算是以被看作是常量表達式它可以用在任何需要常量表

達式的地方如數組的維數或模闆的非類型參數例如

// ok: 編譯時刻常量表達式

int array[ sizeof( some_type_T )];

2. From  網友.

解析C語言中的sizeof

http://www.ccidnet.com 作者:方敏、吳鳴鳴 (2001-04-19 14:43:36)

一、sizeof的概念 

  sizeof是C語言的一種單目操作符,如C語言的其他操作符++、--等。它并不是函數。sizeof操作符以位元組形式給出了其操作數的存儲大小。操作數可以是一個表達式或括在括号内的類型名。操作數的存儲大小由操作數的類型決定。 

二、sizeof的使用方法 

  1、用于資料類型 

  sizeof使用形式:sizeof(type) 

  資料類型必須用括号包覆。如sizeof(int)。 

  2、用于變量 

  sizeof使用形式:sizeof(var_name)或sizeof var_name 

  變量名可以不用括号包覆。如sizeof (var_name),sizeof var_name等都是正确形式。帶括号的用法更普遍,大多數程式員采用這種形式。 

  注意:sizeof操作符不能用于函數類型,不完全類型或位字段。不完全類型指具有未知存儲大小的資料類型,如未知存儲大小的數組類型、未知内容的結構或聯合類型、void類型等。 

  如sizeof(max)若此時變量max定義為int max(),sizeof(char_v) 若此時char_v定義為char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。 

三、sizeof的結果 

  sizeof操作符的結果類型是size_t,它在頭檔案中typedef為unsigned int類型。該類型保證能容納實作所建立的最大對象的位元組大小。 

  1、若操作數具有類型char、unsigned char或signed char,其結果等于1。 

  ANSI C正式規定字元類型為1位元組。 

  2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double類型的sizeof 在ANSI C中沒有具體規定,大小依賴于實作,一般可能分别為2、2、2、2、4、4、4、8、10。 

  3、當操作數是指針時,sizeof依賴于編譯器。例如Microsoft C/C++7.0中,near類指針位元組數為2,far、huge類指針位元組數為4。一般Unix的指針位元組數為4。 

  4、當操作數具有數組類型時,其結果是數組的總位元組數。 

  5、聯合類型操作數的sizeof是其最大位元組成員的位元組數。結構類型操作數的sizeof是這種類型對象的總位元組數,包括任何墊補在内。 

  讓我們看如下結構: 

  struct {char b; double x;} a; 

  在某些機器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。 

  這是因為編譯器在考慮對齊問題時,在結構中插入空位以控制各成員對象的位址對齊。如double類型的結構成員x要放在被4整除的位址。 

  6、如果操作數是函數中的數組形參或函數類型的形參,sizeof給出其指針的大小。 

四、sizeof與其他操作符的關系 

  sizeof的優先級為2級,比/、%等3級運算符優先級高。它可以與其他操作符一起組成表達式。如i*sizeof(int);其中i為int類型變量。 

五、sizeof的主要用途 

  1、sizeof操作符的一個主要用途是與存儲配置設定和I/O系統那樣的例程進行通信。例如: 

  void *malloc(size_t size), 

  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。 

  2、sizeof的另一個的主要用途是計算數組中元素的個數。例如: 

  void * memset(void * s,int c,sizeof(s))。 

六、建議 

  由于操作數的位元組數在實作時可能出現變化,建議在涉及到操作數位元組大小時用ziseof來代替常量計算。 (http://www.fanqiang.com)  

3. From smth c++版

發信人: jiangfei (afei), 信區: CPlusPlus

标  題: 關于sizeof的小問題,謝謝賜教

發信站: BBS 水木清華站 (Tue Mar 15 15:08:06 2005), 站内

#include<iostream>

using namespace std;

int main(){

    char str[] = "a short string";

    string st  = "a short string";

    cout << sizeof (str) //15,算'/0'

         << endl

         << sizeof (st) //16,why?

         << endl;

    if(str[14] == '/0')

        cout << "ok1" << endl;//ok1.I c.

    if( st[15] == '/0')

        cout << "ok2" << endl;//ok2,why?

}

--

※ 來源:·BBS 水木清華站 http://smth.org·[FROM: 202.118.229.*]

 [本篇全文] [回複文章] [回信給作者] [本篇作者:xxxdg] [進入讨論區] [傳回頂部]  2 

發信人: xxxdg (沙漠蜥蜴), 信區: CPlusPlus

标  題: Re: 關于sizeof的小問題,謝謝賜教

發信站: BBS 水木清華站 (Tue Mar 15 15:15:18 2005), 站内

你要不要試試

string st="hello";

cout<<sizeof(st)<<endl;

呵呵

【 在 jiangfei (afei) 的大作中提到: 】

: #include<iostream>

: using namespace std;

: int main(){

:     char str[] = "a short string";

:     string st  = "a short string";

:     cout << sizeof (str) //15,算'/0'

:          << endl

:          << sizeof (st) //16,why?

:          << endl;

:     if(str[14] == '/0')

:         cout << "ok1" << endl;//ok1.I c.

:     if( st[15] == '/0')

:         cout << "ok2" << endl;//ok2,why?

: }

--

※ 來源:·BBS 水木清華站 smth.org·[FROM: 162.105.77.*]

 [本篇全文] [回複文章] [回信給作者] [本篇作者:jiangfei] [進入讨論區] [傳回頂部]  3 

發信人: jiangfei (afei), 信區: CPlusPlus

标  題: Re: 關于sizeof的小問題,謝謝賜教

發信站: BBS 水木清華站 (Tue Mar 15 15:24:54 2005), 站内

blush!

見笑!

but why ???

all are 16?

【 在 xxxdg (沙漠蜥蜴) 的大作中提到: 】

: 你要不要試試

: string st="hello";

: cout<<sizeof(st)<<endl;

: ...................

--

※ 修改:·jiangfei 於 Mar 15 15:27:10 2005 修改本文·[FROM: 202.118.229.*]

※ 來源:·BBS 水木清華站 http://smth.org·[FROM: 202.118.229.*]

 [本篇全文] [回複文章] [回信給作者] [本篇作者:jiangfei] [進入讨論區] [傳回頂部]  4 

發信人: jiangfei (afei), 信區: CPlusPlus

标  題: Re: 關于sizeof的小問題,謝謝賜教

發信站: BBS 水木清華站 (Tue Mar 15 15:30:53 2005), 站内

The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.

But return 16 for sizeof(string) stands for nothing at all?

【 在 jiangfei (afei) 的大作中提到: 】

: blush!

: 見笑!

: but why ???

: ...................

--

※ 來源:·BBS 水木清華站 http://smth.org·[FROM: 202.118.229.*]

 [本篇全文] [回複文章] [回信給作者] [本篇作者:xxxdg] [進入讨論區] [傳回頂部]  5 

發信人: xxxdg (沙漠蜥蜴), 信區: CPlusPlus

标  題: Re: 關于sizeof的小問題,謝謝賜教

發信站: BBS 水木清華站 (Tue Mar 15 15:33:44 2005), 站内

think and answer my question , then you will got it

class a

{

public:

   a(){ _data = new int [100];}

   ~a(){ delete [] _data;}

   int * _data;

};

a _x;

cout<<sizeof(_x)<<endl;

output choice:

1) 100

2)  128

3) 4

4) 4 + sizeof(a and ~a)

【 在 jiangfei (afei) 的大作中提到: ;】

: blush!

: 見笑!

: but why ???

: all are 16?

--

※ 來源:·BBS 水木清華站 smth.org·[FROM: 162.105.77.*]

 [本篇全文] [回複文章] [回信給作者] [本篇作者:jiangfei] [進入讨論區] [傳回頂部]  6 

發信人: jiangfei (afei), 信區: CPlusPlus

标  題: Re: 關于sizeof的小問題,謝謝賜教

發信站: BBS 水木清華站 (Tue Mar 15 15:36:25 2005), 站内

 但為什麼

 string st = "a short string";

 st[15] == '/0'??

【 在 xxxdg (沙漠蜥蜴) 的大作中提到: 】

: 你要不要試試

: string st="hello";

: cout<<sizeof(st)<<endl;

: ...................

--

※ 來源:·BBS 水木清華站 http://smth.org·[FROM: 202.118.229.*]

 [本篇全文] [回複文章] [回信給作者] [本篇作者:xxxdg] [進入讨論區] [傳回頂部]  7 

發信人: xxxdg (沙漠蜥蜴), 信區: CPlusPlus

标  題: Re: 關于sizeof的小問題,謝謝賜教

發信站: BBS 水木清華站 (Tue Mar 15 15:37:40 2005), 站内

can operator [] be overloaded?

【 在 jiangfei (afei) 的大作中提到: 】

:  但為什麼

:  string st = "a short string";

:  st[15] == '/0'??

--

※ 來源:·BBS 水木清華站 smth.org·[FROM: 162.105.77.*]

 [本篇全文] [回複文章] [回信給作者] [本篇作者:owl2008] [進入讨論區] [傳回頂部]  8 

發信人: owl2008 (owl), 信區: CPlusPlus

标  題: Re: 關于sizeof的小問題,謝謝賜教

發信站: BBS 水木清華站 (Tue Mar 15 15:38:27 2005), 站内

type object;

sizeof object == sizeof type

【 在 jiangfei (afei) 的大作中提到: 】

: The sizeof operator cannot return the size of dynamically allocated arrays or external arrays.

: But return 16 for sizeof(string) stands for nothing at all?

--

ID owl

MSN:[email protected]

QQ:85475939

BLOG:http://blog.csdn.net/owl2008/

※ 來源:·BBS 水木清華站 smth.org·[FROM: 220.184.16.*]

接下來 ,總結一下我自己的了解:

<1> . 對齊問題很微妙:

<2> . 一個重要用途: 由于操作數的位元組數在實作時可能出現變化。

      建議在涉及到操作數位元組大小時用ziseof來代替常量計算。

      int ia[] = { 0, 1, 2 };

   // sizeof 傳回整個數組的大小

   size_t array_size = sizeof ia;

   // sizeof 傳回int 類型的大小

   size_t element_size = array_size / sizeof( int );

<3> . 當操作數是指針時,sizeof依賴于編譯器,是指針大小而非所指元素大小.

      在現有32位機器,VC6.0環境中,sizeof(pointer) 為 4。

<4> . 當操作數具有數組類型時,其結果是數組的總位元組數。

<5> . 一個string 的大小(sizeof)與它所指的字元串的長度無關.

      sizeof(string str="hello");sizeof(string str="a long long long long long string")

      在現有環境(32位機器,VC6.0編譯器)都是16。

<6> . 類的sizeof由于對齊等原因變得很微妙,尤其在具有虛函數時更加難以捉摸.

      比如,

      class a

      {

      public:

      a(){ _data = new char [100];}

      ~a(){ delete [] _data;}

      char * _data;   //sizeof(pointer) = 4

      long data2;     //sizeof(long) = 4

      char dat[10];   //sizeof(dat) = 10

      char dat1;      //sizeof(char) = 1

      };

      a _x;

      cout<<sizeof(_x)<<endl;//輸出20

      變為:

      class a

      {

      public:

      a(){ _data = new char [100];}

      ~a(){ delete [] _data;}

      char * _data;   //sizeof(pointer) = 4

      char dat[10];   //sizeof(dat) = 10  換位置

      long data2;     //sizeof(long) = 4  換位置

      char dat1;      //sizeof(char) = 1

      };

      a _x;

      cout<<sizeof(_x)<<endl;//輸出24

繼續閱讀