当我们将大文件写入磁盘(超过4Gb)时,std::ostream::write是否有任何限制?
例如,当我写
时ofs.write((char*)m.data, m.total()*sizeof(float));
表达式m.total()*sizeof(float)
可以溢出吗?我需要以什么格式指定大小(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()
返回size_t
我该怎么办?
正确安全地将其转换为std::streamsize
?
答案 0 :(得分:1)
没有这样的限制,因为大块文件可以通过块写入块。
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
的值范围内时,转换才是安全的。只要满足此条件,任何类型转换方法都可以正常工作。