当我们将大文件写入磁盘(大于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/