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
的取值范围内,转换才是安全的。只要满足这个条件,任何类型转换方法都可以。
当我们将大文件写入磁盘(超过 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
的取值范围内,转换才是安全的。只要满足这个条件,任何类型转换方法都可以。