來源
size_t是標準C庫中定義的,應為unsigned int,在64位系統中為 long unsigned int。
數據類型"socklen_t"和int應該具有相同的長度,否則就會破壞 BSD套接字層的填充。POSIX開始的時候用的是size_t, Linus Torvalds(他希望有更多的人,但顯然不是很多) 努力向他們解釋使用size_t是完全錯誤的,因為在64位結構中 size_t和int的長度是不一樣的,而這個參數的長度必須和int一致,因為這是BSD套接字接口標準。最終POSIX的那幫傢伙找到了解決的辦法,那就是創造了一個新的類型"socklen_t"。Linus Torvalds說這是由於他們發現了自己的錯誤但又不好意思向大傢伙兒承認,所以另外創造了一個新的數據類型 。
使用
一個基本的無符號整數的C / C + +類型, 它是sizeof操作符返回的結果類型, 該類型的大小是選擇。因此,它可以存儲在理論上是可能的任何類型的數組的最大大小。 換句話說,一個指針可以被安全地放進為size_t類型(一個例外是類的函式指針,但是這是一個特殊的情況下)。 size_t類型通常用於循環、數組索引、大小的存儲和地址運算。 雖然size_t可以存儲一個指針,它的目的是更好地使用另一個unsinged整數類型uintptr_t形式。 在某些情況下,使用size_t類型是更為有效,比習慣性使用無符號類型的程式設計師更安全。
size_t是在基於無符號整數memsize類型的C / C + +的標準庫中定義的。 C語言中,此類型位於頭檔案stddef.h中,而在C++中,則位於cstddef中。
實現方式
在C++中,設計 size_t 就是為了適應多個平台的 。size_t的引入增強了程式在不同平台上的可移植性。size_t是針對系統定製的一種數據類型,一般是整型,因為C/C++標準只定義一最低的位數,而不是必需的固定位數。而且在記憶體里,對數的高位對齊存儲還是低位對齊存儲各系統都不一樣。為了提高代碼的可移植性,就有必要定義這樣的數據類型。一般這種類型都會定義到它具體占幾位記憶體等。當然,有些是編譯器或系統已經給定義好的。經測試發現,在32位系統中size_t是4位元組的,而在64位系統中,size_t是8位元組的,這樣利用該類型可以增強程式的可移植性。
詳細解釋
size_t在C語言中就有了。
它是一種“整型”類型,裡面保存的是一個整數,就像int, long那樣。這種整數用來記錄一個大小(size)。size_t的全稱應該是size type,就是說“一種用來記錄大小的數據類型”。
通常我們用sizeof(XXX)操作,這個操作所得到的結果就是size_t類型。
因為size_t類型的數據其實是保存了一個整數,所以它也可以做加減乘除,也可以轉化為int並賦值給int類型的變數。
類似的還有wchar_t, ptrdiff_t。
wchar_t就是wide char type,“一種用來記錄一個寬字元的數據類型”。
ptrdiff_t就是pointer difference type,“一種用來記錄兩個指針之間的距離的數據類型”。
通常,size_t和ptrdiff_t都是用typedef來實現的。你可能在某個頭檔案裡面找到類似的語句:
typedef unsigned int size_t;
typedef int ptrdiff_t;
而wchar_t則稍有不同。在一些舊的編譯器中,wchar_t也可能是用typedef來實現,但是新的標準中wchar_t已經是C/C++語言的關鍵字,wchar_t類型的地位已經和char, int的地位等同了。
在標準C/C++的語法中,只有int float char bool等基本的數據類型,至於size_t,或size_type都是以後的編程人員為了方便記憶所定義的一些便於理解的由基本數據類型的變體類型。
例如:typedef int size_t;定義了size_t為整型。
示例代碼
int i; // 定義一個int類型的變數i
size_t size = sizeof(i); // 用sizeof操作得到變數i的大小,這是一個size_t類型的值
// 可以用來對一個size_t類型的變數做初始化
i = (int)size; // size_t類型的值可以轉化為int類型的值
char c = 'a'; // c保存了字元a,占一個位元組
wchar_t wc = L'a'; // wc保存了寬字元a,占兩個位元組。注意'a'表示字元a,L'a'表示寬字元a
int arr[] = {1, 2, 3, 4, 5}; // 定義一個數組
int* p1 = &arr; // 取得數組中元素的地址,賦值給指針
int* p2 = &arr;
ptrdiff_t diff = p2 - p1; // 指針的減法可以計算兩個指針之間相隔的元素個數
// 所得結果是一個ptrdiff_t類型
i = (int)diff; // ptrdiff_t類型的值可以轉化為int類型的值