2012-05-17 835 views
34

除了每种类型可容纳的值的大小之外,的用法size_toff_t之间的主要区别是什么?这是否只是size_t类型用于绝对尺寸并且off_t类型用于补偿的惯例?还是比这更深入?size_t和off_t之间的用法差异是什么?

我正在写一个包装类来启用使用mmap编写大型文件,我想知道最佳类型将用于他们的参数。鉴于我想写入大于4GB的文件,我很想使用size_t来处理所有事情,但这是否是最佳做法? (?或者我应该使用一些off64_t类型某些功能)

例如,要我writeAt函数声明为:

MMapWriter::writeAt(off64_t offset, const void* src, size_t size) 

MMapWriter::writeAt(size_t offset, const void* src, size_t size) 

回答

44

size_t为对象,off_t是为文件。

mmap合并两个概念,几乎是按照定义。我个人认为我会使用size_t,因为不管它是什么,映射文件也是(虚拟)内存中的一个数组。

size_t是标准C++,off_t是Posix的,并off64_t是GNU扩展与所述功能fopen64ftello64等进入我认为它应该总是在64位GNU系统相同类型off_t,但不要在没有检查的情况下赌你的公司。

它应该是相关的,off_t是有符号的,而size_t是无符号的。但与size_t签署对应的是ptrdiff_t,所以当你需要一个签名类型它并不意味着你应该使用off_toff64_t

+0

谢谢史蒂夫,这是一个很大的帮助。我想我还没有完成“mmap”桥接这两个概念的链接。 –

+0

很好的答案,但为什么在地狱做fread()和fwrite()采取'size_t'呢? –

+4

注意,还有ssize_t作为size_t的已签名对象。 – fuz

12

size_t是C++(和C)标准的一部分,指的是sizeof表达式的类型。 off_t由Posix标准定义,并且指的是文件的大小。

+0

因此使用'off_t'是不可移植的?或者C/C++标准本身坚持posix标准。 –

+3

@Als:Posix库是C(和C++)标准的一组扩展。他们添加的内容是'off_t'和使用它的文件函数,比如'lseek'。所以不,C/C++不遵守Posix。无论如何,Posix是一个操作系统的规范,而不仅仅是一种编程语言:以及它包含的库​​,例如shell和shell实用程序,这些都超出了C标准的范围(如果你喜欢,Posix会选择标准'系统'的定义会消失)。 –

+3

如果您已经在使用'mmap',也是一个Posix函数,那么使用'off_t'是便携式的。这是可移植的Posix代码,它不是可移植的C++代码。 –

相关问题