2011-10-09 56 views
2

我得到這個:'uintmax_t'到'size_t'和'unsigned int'轉換中的數據丟失是什麼?

警告C4244:初始化':轉換從 'uintmax_t型' 數據

上的 '無符號整型',可能的損失:

boost::shared_array<char> buffer(new char[file->size]); 

...然後這個:

警告C4244:'參數':從'uintmax _t」到 '爲size_t',數據上

的可能損失:

boost::asio::write(*socket, boost::asio::buffer(buffer.get(), file->size)); 

難道我害怕或者它是確定?

回答

0

這取決於您的文件有多大。

大多數計算機具有比RAM更大的磁盤存儲空間,並且在很多情況下可以支持單個文件太大而無法放入RAM中。在這種情況下,分配可能失敗,或者文件大小可能會被截斷爲指針的大小,在這種情況下,您將分配一個不足以容納該文件的緩衝區。

您可以檢測過度大小的文件有:

size_t buffersize(file->size); 
if (buffersize != file->size) { /* error, file too large to fit into virtual memory */ } 
/* use buffersize for buffer allocation */ 

這也將使警告消失。

3

可能file->size的類型是uintmax_t,它大於operator new[]對陣列大小所採用的size_t。通常第一個可能是64位整數,而第二個只能是32位。

實際上,當您嘗試處理超過4GB的文件時,這會導致問題,因爲size_t無法表示大量的字節。如果您只希望處理較小的文件,其中size_t足夠大以存儲文件大小,則不會有問題。

3

這取決於實施。

uintmax_t是實現提供的最大的無符號類型。 size_tsizeof運算符的結果類型,其大小足以容納任何對象的大小。當然,unsigned int是類型爲int的未簽名版本。

唯一保證是size_tunsigned int都至少爲16位(但可能是更大的),uintmax_t是至少64位(假定C99規則),並且uintmax_t是至少一樣寬的任何其它無符號類型。

推測file->size是文件的字節大小,它可能是uintmax_t類型。根據系統的不同,文件的最大大小可能會大於內存中任何可能的對象的大小。

如果此特定文件的大小不是太大,則沒有問題。但是,如果size_t是32位(意味着對象不能大於4千兆字節),並且您的文件是5千兆字節,那麼您將無法分配足夠大的內存緩衝區以容納內容文件。

而最大值size_t,SIZE_MAX,只是對象最大尺寸的上限。僅僅因爲SIZE_MAX是2 ** 31-1,這並不一定意味着你實際上可以創建一個很大的對象。

相關問題