sizeof和strlen

1、
sizeof計算中分配的大小,靜態變量static是存放在全局數據區的,是不會計算在內的

2、
sizeof不是函數,也不是一元運算符,它是個類似宏定義的特殊關鍵字,sizeof()。括號內的內容在編譯過程中是不被編譯的,而是被替代類型,如int a=8; sizeof(a)。在編譯過程中不管a是什麼值,只是被替換成類型sizeof(int),結果爲4。如果是sizeof(a=6)呢?也是一樣地轉換成a的類型。但是要注意,因爲a=6是不被編譯的,所以執行完sizeof(a=6)之後,a的值還是8,是不變的。

3、
sizeof和strlen的區別:
(1)sizeof操作符的結果類型是size_t,它在頭文件中的typedef爲unsigned int 類型。該類型保證能容納實現所建立的最大對象的字節大小。
(2)sizeof是運算符,strlen是函數 
(3)sizeof可以用類型做參數,strlen只能用char*做參數,且必須以“\0”結尾的。sizeof還可以用函數做參數。
  short f();
  printf("%d\n",sizeof(f()));
輸出結果是sizeof(short),即爲2
(4)數組做sizeof的參數不退化,傳遞給strlen就退化爲指針
(5)大部分編譯程序在編譯的時候就把sizeof計算過了,是類型或是變量的長度
(6)strlen的結果要在運行的時候才能計算出來,用來計算字符串的長度,而不是類型在內存的大小。
(7)sizeof後如果是類型必須加括號,如果是變量名可以不加括號。這是因爲sizeof是個操作符而不是個函數
(8)當使用了一個結構類型或變量時,sizeof返回實際的大小。當使用一靜態的空間數組時,sizeof返回全部數組的尺寸。sizeof操作符不能返回被動態分配的數組或外部數組的尺寸。
(9)數組作爲參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首地址,如fun(char[8])、fun(char[])都等價於fun(char *)。在C++裏傳遞數組永遠是傳遞指向數組首元素的指針,編譯器不知道數組的大小。如果想在函數內知道數組的大小,需要這樣做:進入函數後用memcpy將數組複製出來,長度由另一個形參傳進去。
fun(unsigned char *p1,int len)
{
     unsigned char* buf = new unsigned char[len+1];
     memcpy(buf,p1,len);
}
(10)計算結構變量的大小就必須討論數據對齊問題。爲了使CPU存取的速度最快,C++在處理數據時經常把結構變量中的成員的大小按照4或者8的倍數計算。這就叫數據對齊。這樣做可能會浪費一些內存,但在理論上CPU的速度快了。
當然,這樣的設置會在讀寫一些別的應用程序生成的數據文件或交換數據時帶來不便。MS VC++中加上
#pragam pack(n)的設定,有時候sizeof得到的與實際不等。一般在VC++中加上#pragam pack(n)的設定即可。或者如果按字節存儲,而不進行數據對齊,可以在option對話框中修改Advanced Complier選項卡中的“Data Alignment”爲按字節對齊。
(11)sizeof操作符不能用於函數類型、不完全類型或位字段。不完全類型指具有未知存儲大小的數據的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void類型等。

4、
使用sizeof注意以下幾個結論
(1)unsigned影響的只是最高位bit的意義(正/負),數據長度是不會被改變的,所以
               sizeof(unsigned int)== sizeof(int)
(2)自定義類型的sizeof取值等同於它的類型原形。如:
               typedef short WORD;
               sizeof(WORD) == sizeof(short)
(3)對函數使用sizeof,在編譯階段會被函數返回值的類型取代。如 int f1(){return 0;}
                cout<<sizeof(f1())<<endl;
            f1()返回值爲int,因此被認爲是int
(4)只要是指針,大小就是4,如
               sizeof(string *)==4
(5)數組的大小是各維數組的乘積*數組元素的大小




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章