GCC 4.4.1,C99size_t是否便攜?
我使用size_t
和size_t
是unsigned int
。但是,這取決於您是否正在運行32位或64位。
我將使用size_t
來存儲緩衝區的大小。
所以我不認爲這將是非常便攜,如果跨架構使用。
只是一個問題,在32位或64位上使用size_t
。什麼情況會導致最嚴重的問題?
GCC 4.4.1,C99size_t是否便攜?
我使用size_t
和size_t
是unsigned int
。但是,這取決於您是否正在運行32位或64位。
我將使用size_t
來存儲緩衝區的大小。
所以我不認爲這將是非常便攜,如果跨架構使用。
只是一個問題,在32位或64位上使用size_t
。什麼情況會導致最嚴重的問題?
size_t
保證是能夠保持您的實現任何對象的字節數。 這就是爲什麼返回類型sizeof
是size_t
。
所以,是的,它是便於攜帶。
唯一真正嚴重的問題是試圖訪問一個相當大的數組或size_t的大數。
就像一個普通的「int」在64位上可能就足夠了,但是可能會導致32位崩潰,因爲它在32位系統上對於int來說太大了。
如果您使用malloc()或read(),對緩衝區使用size_t或ssize_t是有意義的。爲便攜,請使用SIZE_MAX,SSIZE_MAX,sizeof(輸入您的緩衝區)和%zd或%zu printf()。
不幸的是,微軟的C編譯器不支持'z'大小改性劑'的printf()'。 – Novelocrat 2009-11-08 17:03:17
'z'修飾符是C99標準的一部分。迄今爲止,微軟編譯器使用C89/90。在C89/90中,size_t打印的「可移植性」必須手動實現。 – AnT 2009-11-08 17:17:09
那些bas ...,我忘了。那麼,他確實詢問了C99。我猜他確實詢問了「最嚴重」的問題,這個問題可能是Linux的樂觀分配,或者輕率地假設(count * sizeof())不會溢出,或者可能認爲您首先需要分配那麼多內存。 – paul 2009-11-08 17:22:57
你不應該認爲size_t是一個無符號整數(see this answer),但我認爲它在兩種架構上都有相同的範圍。
取決於你正在使用size_t。
如果使用它來確定內存緩衝區的大小,它將是安全的,因爲size_t足夠大,可以解決任何計算機的整個內存問題。因此,如果內存緩衝區大於此值,則無論如何您都有問題。另一方面,如果將其用作通用無符號整數來計算Universe中的星號數,則可能在32位系統上出現問題(不確定64位系統)。
您還得到了off_t和ptrdiff_t/ssize_t,它們在架構之間以相同的方式不同。
如果您正確使用它們,那麼它們可跨架構移植。在32位系統中,它們都是32位寬,而在64位系統中它們都是64位寬。這就是你想要的 - 在32位系統上,緩衝區的大小不可能大於32位size_t,但在64位系統上它可能會大得多。
你不應該使用整數,長整型或其他任何東西。除此之外,長度的大小取決於平臺(大多數32位系統上的32位,64位Unix系統上的64位,64位Windows上的32位)。
在這種情況下很難弄清楚「便攜式」的含義。術語「便攜式」允許多種不同的解釋。
類型size_t
有一個非常具體的目的。它可以保存給定實現中的任何對象的大小。即它總是可以接收到sizeof()
運算符的結果。類型size_t
沒有其他目的,並且在其預期的應用程序中它是100%便攜式的,就像任何東西一樣便攜。
你問的是什麼樣的「便攜式」又一次不清楚。
正如其他人所說,size_t
是正確的,完全可以接受的結果sizeof()
或任何可表示的對象的大小以字節爲單位。你有什麼需要注意的是:
size_t
,其大小與一些無符號整型相同。它不一定是相同的字節數作爲最大的無符號整數類型,unsigned int
,unsigned long
的等sizeof(size_t)
是如此memcpy
實現定義的字節數「荷蘭國際集團,或分配到比其他uintmax_t
任何整數類型是餿主意。我甚至不確定是否可以安全地假設它的尺寸相同或比uintmax_t
小。size_t
值寫入二進制文件並將其讀取回size_t
由另一個進程,在不同的機器上,或通過使用不同的編譯器選項編譯的某些內容可能會危害您的健康。size_t
值並試圖使用上的另一側的sizeof(size_t)
緩衝器以接收這是相當不安全的。所有這些都是任何其他整數類型的標準問題,除了unsigned char
。所以size_t
就像任何其他整數類型一樣便攜。
只要您不嘗試將size_t類型變量保存爲二進制文件或通過網絡連接發送,size_t便攜。你開始做的第二件事就是將它作爲一種非常不可移植的東西,它被粘在地板上。 – 2012-06-13 09:30:34