2012-03-10 99 views
7

我想知道爲什麼這個size_t用於我可以使用說int類型。其表示size_t是返回類型的sizeof運算符。這是什麼意思?比如如果我使用sizeof(int)並存儲它返回到int類型變量,那麼它也可以工作,沒有必要將它存儲在size_t類型變量中。我只是清楚地想知道使用size_t的基本概念,用一個清楚易懂的例子。感謝任何人都可以解釋爲什麼size_t類型用於例子嗎?

+0

您可以使用int來存儲sizeof的返回值,這與您有時可以將int 2147483647存儲在int中的方式相同。恰恰相反,實現特定的大小正確匹配。 – Lalaland 2012-03-10 23:39:19

+0

另請參閱此問題:http://stackoverflow.com/questions/918787/whats-sizeofsize-t-on-32-bit-vs-the-various-64-bit-data-models – ChrisWue 2012-03-10 23:42:59

+0

任何人都可以確認size_t是相同大小的處理器註冊? – arthurprs 2012-03-10 23:44:54

回答

9

size_t保證能夠代表最大尺寸可能,int不是。這意味着size_t更便攜。

例如,如果int最多隻能存儲255個字符,但您可以分配5000個字節的數組?顯然這不會起作用,但size_t它會。

+1

從技術上講,int必須至少爲16位,它必須至少跨越[-32767..32767]範圍。 (爲什麼不用-32768?爲了適應補碼和符號 - 幅度系統,以防有人想在舊的Univac機器上使用C,當然這些系統有18位和36位整數,9位「 char)。 – torek 2012-03-11 00:54:49

+0

@torek出於某種原因,我的印象是int只需要C> 16而不是C++。雖然沒有檢查標準。 – Pubby 2012-03-11 01:10:22

+0

@Pubby:C++從C繼承了C++ 1.1 p2 C++是一種基於ISO/IEC 9899:1999中描述的C編程語言的通用編程語言。編程語言 2012-03-11 03:11:56

4

最簡單的例子是相當日:一箇舊的16比特int系統上的RAM 64 K,一個int的值可以是任何地方從-32768到32767,但之後:

char buf[40960]; 

緩衝區buf佔用40千字節,所以sizeof buf太大而不適合int,它需要unsigned int

同樣的事情今天能發生,如果您使用的32位int但允許程序在同一時間訪問超過4 GB的RAM,因爲是所謂的「I32LP64」模型(32位int的情況下,64位long和指針)。這裏的size_t類型與unsigned long的範圍相同。

0

它是實現定義,但在64位系統上,你會發現size_t往往是64位,而int仍然是32位(除非它是ILP64 or SILP64模型)。

1

您使用的size_t主要用於轉換指針到相同的無符號整數大小,對指針進行計算,就好像它們是整數一樣,否則會在編譯時被阻止。這樣的代碼旨在在不同指針大小的上下文中正確編譯和構建,例如, 32位模型與64位。

相關問題