“uintmax_t”到“size_t”和“unsigned int”转换中的数据丢失是多少?

Rel*_*lla 5 c++ int boost

我明白了:

\n\n
\n

警告 C4244:“初始化”:从“uintmax_t”转换为“unsigned int”,可能会丢失数据

\n
\n\n

在:

\n\n
boost::shared_array<char> buffer( new char[file->size]);\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 然后是这个:

\n\n
\n

警告 C4244:“argument”:从“uintmax_t”转换为“size_t”,可能会丢失数据

\n
\n\n

在:

\n\n
boost::asio::write(*socket, boost::asio::buffer(buffer.get(), file->size));\n
Run Code Online (Sandbox Code Playgroud)\n\n

我会害怕还是没关系?

\n

sth*_*sth 5

可能是比数组大小更大的file->size类型。通常,第一个可以是 64 位整数,而第二个只能是 32 位。uintmax_tsize_toperator new[]

实际上,当您尝试处理超过 4GB 的文件时,这会导致问题,因为它们size_t无法表示如此大的字节数。如果您只希望处理size_t足够大以存储文件大小的较小文件,那么不会有问题。


Kei*_*son 5

这取决于实施。

uintmax_t是实现提供的最大无符号类型。 size_t是运算符结果的类型sizeof,足够大以容纳任何对象的大小。 unsigned int当然,是类型的无符号版本int

唯一的保证是size_tunsigned int都至少为 16 位(但可能更大),uintmax_t至少为 64 位(假设 C99 规则),并且uintmax_t至少与任何其他无符号类型一样宽。

大概file->size是文件的大小(以字节为单位),并且它的类型可能是uintmax_t. 根据系统的不同,文件的最大大小很可能大于内存中任何可能对象的大小。

如果这个特定文件的大小不是太大,那就没有问题。但是,如果size_t是 32 位(意味着对象不能大于 4 GB),并且您的文件是 5 GB,那么您将无法分配足够大的内存缓冲区来容纳对象的内容文件。

size_t并且, ,的最大值SIZE_MAX只是对象最大尺寸的上限。仅仅因为SIZE_MAX2**31-1,并不一定意味着您实际上可以创建那么大的对象。


Ben*_*igt 1

这取决于您的文件有多大。

大多数计算机的磁盘存储空间都大于 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 */
Run Code Online (Sandbox Code Playgroud)

这也会使警告消失。