size_t和off_t之间的用法差异是什么?

Lee*_*ton 39 c++ linux

除了每种类型可以容纳的值的大小之外,和之间使用的主要区别是什么?是否只是一种惯例,类型用于绝对大小和类型用于抵消?或者它比那更深?size_toff_tsize_toff_t

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

例如,我的writeAt函数应该声明为:

MMapWriter::writeAt(off64_t offset, const void* src, size_t size)
Run Code Online (Sandbox Code Playgroud)

要么

MMapWriter::writeAt(size_t offset, const void* src, size_t size)
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 51

size_t用于对象,off_t用于文件.

mmap根据定义,合并这两个概念.我个人认为我会使用size_t,因为无论它是什么,映射文件也是(虚拟)内存中的数组.

size_t是标准的C++,off_t是Posix的,并且off64_t是GNU扩展与功能去fopen64,ftello64等我它应该永远是同一类型off_t的64位GNU系统,但不赌贵公司,如果没有检查.

它是否相关,off_t是签名而未size_t签名.但签名对应的size_tptrdiff_t,所以当你需要签名类型时,它并不自动意味着你应该使用off_toff64_t.

  • 请注意,还有ssize_t作为size_t的签名对应项. (4认同)
  • @NikReiman:我认为`fread`需要`size_t`,因为关于大小的"最重要的事实"是它与缓冲区的关系.即使文件大于系统中的内存中对象,fread/fwrite读取/写入的对象的大小也仅限于内存.但是C标准并没有很好地处理大文件:`fseek`使用`long`作为偏移量,Posix认为它不令人满意,因此引入了`fseeko`和`off_t`.也许这只是因为C标准最初设想"long"总是最大的整数类型,但微软则反过来说. (3认同)

Jam*_*nze 12

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

  • 如果你已经使用`mmap`,那么使用`off_t`"是可移植的",也是一个Posix函数.它是便携式Posix代码,它不是可移植的C++代码. (4认同)
  • @Als:Posix库是C(和C++)标准的一组扩展.他们添加的东西是`off_t`和使用它的文件函数,比如`lseek`.所以不,C/C++不遵守Posix.无论如何,Posix是操作系统的规范,而不仅仅是一种编程语言:以及它包含的库​​,例如shell和shell实用程序,这些都超出了C标准的范围(如果你愿意,Posix可以选择标准`system`的定义离开了). (3认同)