当我们将大文件写入磁盘(大于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
std::streamsize sz= std::numeric_limits<int>::max()+10;


好的,它是这样的:

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


最后一个问题是m.total()返回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的值范围内时,转换才是安全的。只要满足此条件,任何类型转换方法都可以正常工作。

关于c++ - std::ostream::write有什么限制吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31914873/

10-11 22:57
查看更多