【问题标题】:What is the loss of data in 'uintmax_t' to 'size_t' and 'unsigned int' conversion?'uintmax_t' 到 'size_t' 和 'unsigned int' 转换中的数据丢失是什么?
【发布时间】:2011-10-09 19:59:42
【问题描述】:

我明白了:

警告 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));

我应该害怕还是可以?

【问题讨论】:

    标签: c++ boost int


    【解决方案1】:

    可能file-&gt;sizeuintmax_t 类型,它大于operator new[] 用于数组大小的size_t。通常第一个可以是 64 位整数,而第二个只能是 32 位。

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

    【讨论】:

    • "实际上,当您尝试处理超过 4GB 的文件时,这会导致问题" 这是假设 size_t 是 32 位的,但它可能更大,这意味着它对于一般情况是不正确的.
    【解决方案2】:

    这取决于实现。

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

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

    大概file-&gt;size 是文件的字节大小,它可能是uintmax_t 类型。根据系统的不同,文件的最大大小可能会大于内存中任何可能对象的大小。

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

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

    【讨论】:

      【解决方案3】:

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

      大多数计算机具有比 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 */
      

      这也会使警告消失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-07
        • 2010-09-13
        相关资源
        最近更新 更多