我明白了:
\n\n\n\n\n警告 C4244:“初始化”:从“uintmax_t”转换为“unsigned int”,可能会丢失数据
\n
在:
\n\nboost::shared_array<char> buffer( new char[file->size]);\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\xa6 然后是这个:
\n\n\n\n\n警告 C4244:“argument”:从“uintmax_t”转换为“size_t”,可能会丢失数据
\n
在:
\n\nboost::asio::write(*socket, boost::asio::buffer(buffer.get(), file->size));\nRun Code Online (Sandbox Code Playgroud)\n\n我会害怕还是没关系?
\n可能是比数组大小更大的file->size类型。通常,第一个可以是 64 位整数,而第二个只能是 32 位。uintmax_tsize_toperator new[]
实际上,当您尝试处理超过 4GB 的文件时,这会导致问题,因为它们size_t无法表示如此大的字节数。如果您只希望处理size_t足够大以存储文件大小的较小文件,那么不会有问题。
这取决于实施。
uintmax_t是实现提供的最大无符号类型。 size_t是运算符结果的类型sizeof,足够大以容纳任何对象的大小。 unsigned int当然,是类型的无符号版本int。
唯一的保证是size_t和unsigned 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,并不一定意味着您实际上可以创建那么大的对象。
这取决于您的文件有多大。
大多数计算机的磁盘存储空间都大于 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)
这也会使警告消失。