程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> sizeof操作符詳解一

sizeof操作符詳解一

編輯:C++入門知識

論及測試基礎是Windows 32位平台,VS2008開發工具:   測試基本類型     \     1.基本規則   sizeof 操作符的作用是返回一個對象或類型名所占的內存字節數,返回值的類型為size_t,長度的單位是字節,在編譯而不是運行時確定。   • 對引用類型做sizeof操作將返回存放此引用類型對象所需的內在空間大小。   • 對指針做sizeof操作將返回存放指針所需的內在大小;注意,如果要獲取該指針所指向對象的大小,則必須對指針進行引用。   因為 sizeof 返回整個數組在內存中的存儲長度,所以用 sizeof 數組的結果除以sizeof 其元素類型的結果,即可求出數組元素的個數:   例如:   int ia[8];   int sz =sizeof(ia)/sizeof(*ia);   cout << sz<< endl; //8   2.sizeof與strlen的區別和聯系?    (2.1)sizeof操作符的結果類型是size_t,它在頭文件中typedef為unsigned int類型,該類型保證能容納實現所建立的最大對象的字節大小。   (2.2)sizeof是操作符,strlen是函數。sizeof後如果是類型必須加括弧,如果是變量名可以不加括弧。   (2.3) 數組名作為函數參數時,退化為指針,數組名作為sizeof()參數時,數組名不退化,因為sizeof不是函數。   (2.4)sizeof可以用類型做參數,strlen只能用char*做參數,且必須是以”\0”結尾的。   (2.5)大部分編譯程序在編譯的時候就把sizeof計算過了,這就是sizeof(x)可以用來定義數組維數的原因。strlen的結果要在運行的時候才能計算出來,是用來計算字符串的實際長度,不是類型占內存的大小。

 

\

  (2.6)當作用於結構類型或變量,sizeof返回實際的大小,sizeof如用於數組,只能測出靜態數組的大小,無法檢測動態分配的或外部數組大小。   //對於靜態數組的處理:   char str[11]="0123456789";//注意這裡str大小應該等於,應考慮’\0’在內,否則編譯器會報錯   cout << strlen(str) << endl;//10 strlen計算字符串的長度,以結束符x00為字符串結束。   cout << sizeof(str) << endl;//11 sizeof計算的則是分配的數組str[11]所占的內存空間的大小,不受裡面存儲的內容改變。   (2.7)數組作為參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首地址,如:   fun(char [8])   fun(char [])   都等價於fun(char*)   void Func( char str[100]) {         cout << sizeof(str) << endl;   }    void *p =malloc(100);    cout << sizeof(p) << endl;   所以sizeof(str)和sizeof(p)都為4。   在C++裡參數傳遞數組永遠都是傳遞指向數組首元素的指針,編譯器不知道數組的大小,如果想在函數內知道數組的大小,需要這樣做:進入函數後用memcpy拷貝出來,長度由令一個形參傳進去。   void fun(unsigned char *p1,int len)   {       unsigned char* buf = new unsigned char[len + 1];       memcpy(buf,p1,len);   }   //對於指針的處理:   char *ss= "0123456789";    cout << sizeof(ss) << endl;//4 ss是指向字符串常量的字符指針,sizeof獲得的是一個指針所占的空間,應該是長整型   cout << sizeof(*ss) << endl;//1 *ss是第一個字符其實就是獲得了字符串的第一位’’所占的內存空間,是char類型的,占了位   cout << strlen(ss) << endl;//10,如果要獲得這個字符串的長度,則一定要使用strlen   //另外,下面的方法可以用於確定該靜態數組可以容納元素的個數 int a[3]= {1,2,3};   cout  << sizeof a/sizeof(typeid(a[0]).name());//3   (2.8) sizeof()和初不初始化,沒有關系,strlen()和初始化有關。比較:   \       3.簡單結構體的sizeof   結構體每個變量分開占用空間。   字節對齊的細節和編譯器實現相關,但一般而言,滿足三個准則: 1) 結構體變量的首地址能夠被其最寬基本類型成員的大小所整除; 2) 結構體每個成員相對於結構體首地址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充字節(internal adding); 3) 結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充字節(trailing padding)。   看內存情況:字節對齊需要在中間補3個字節的CC。   \     可以用pack指令用來調整結構體對齊方式的,#pragmapack的基本用法為:#pragmapack( n ),n為字節對齊數,其取值為1、2、4、8、16。   “空結構體”(不含數據成員)的大小不是0,而是1。 “空結構體”變量也得被存儲。   \       4. union的sizeof   union 變量公用空間。   \     解析:裡面最大的變量類型是int[5], 占用20個字節. 所以它的大小是20  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved