std::ostream::write有什么限制吗?

Is there any limitations of std::ostream::write?

当我们将大文件写入磁盘(超过 4Gb)时,std::ostream::write 有任何限制吗?

例如当我写

ofs.write((char*)m.data, m.total()*sizeof(float));

表达式m.total()*sizeof(float)会溢出吗?我需要以什么格式指定 size(int,long,int64)?

ofs.write 的内存占用量是多少,是否需要一些额外的内存才能完成操作,即逐行写入内存块可能内存效率更高?

更新:

我在 ubuntu x64 上,但这段代码给了我 sz < 0

std::streamsize sz= std::numeric_limits<int>::max()+10;

好的,它是这样工作的:

std::streamsize sz= std::streamsize(std::numeric_limits<int>::max())+10;

最后一个问题是 m.total() return size_t 我该怎么办 正确安全地将其转换为 std::streamsize?

没有这种限制,大文件可以逐块写入。

std::ofstream::write 的第二个参数是 std::streamsize 类型,您可以找到参考 here

关于 std::ofstream::write 的内存占用,std::ofstream 管理一个缓冲区本身,其大小是实现定义的,与您传递给 std::ofstream::write 的第二个参数无关。所以,内存占用基本是固定的。这也意味着对具有大尺寸(第二个参数)的高级 std::ofstream::write 的单次调用可能会导致对某些底层写入函数的多次调用。因此,尝试将多个 std::ofstream::write 调用合并为一个调用并不能真正为您带来多大好处。您可以找到有关 std::ofstream here.

管理的内部缓冲区的参考

关于你最后一个问题,只有std::size_t变量的值在std::streamsize的取值范围内,转换才是安全的。只要满足这个条件,任何类型转换方法都可以。