2011-10-09 64 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,这并不一定意味着你实际上可以创建一个很大的对象。

相关问题