2012-05-17 21 views
34

Aparte del tamaño de los valores que puede contener cada tipo, ¿cuáles son las principales diferencias en uso entre size_t y off_t? ¿Es solo una convención que los tipos size_t se usan para tamaños absolutos y los tipos off_t se usan para los desplazamientos? ¿O es más profundo que eso?¿Cuáles son las diferencias de uso entre size_t y off_t?

Estoy escribiendo una clase contenedora para permitir la escritura de archivos de gran tamaño usando mmap y quiero saber cuáles son los mejores tipos para usar para sus argumentos. Dado que quiero escribir en archivos de> 4GB, estoy tentado de usar size_t para todo, pero ¿es esa la mejor práctica? (? O debo utilizar algunos off64_t tipos para ciertas funciones)

Por ejemplo, si mi función writeAt declararse como sigue:

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

o

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

Respuesta

44

size_t es para los objetos, off_t es para archivos.

mmap combina los dos conceptos, prácticamente por definición. Personalmente creo que usaría size_t, ya que no importa qué más sea, un archivo mapeado también es una matriz en la memoria (virtual).

size_t es estándar C++, off_t es Posix, y off64_t es una extensión de GNU que se va con las funciones fopen64, ftello64, etc. I que debe ser siempre del mismo tipo que off_t en sistemas GNU 64 bits, pero no apueste a su compañía sin cheques.

En caso de ser relevante, off_t está firmado, mientras que size_t no está firmado. Pero la contraparte firmada de size_t es ptrdiff_t, por lo que cuando necesita un tipo firmado, no significa automáticamente que deba usar off_t o off64_t.

+0

Gracias Steve, esto es de gran ayuda. Creo que aún no había hecho el enlace que 'mmap' estaba uniendo los dos conceptos. –

+0

Gran respuesta, pero ¿por qué diablos fread() y fwrite() toman 'size_t' entonces? –

+4

Observe que también hay ssize_t como contraparte firmada de size_t. – fuz

12

size_t es parte de los estándares C++ (y C), y se refiere al tipo de una expresión sizeof. off_t está definido por el estándar Posix, y se refiere al tamaño de un archivo.

+0

Entonces, ¿usar 'off_t' no es portátil? O el estándar C/C++ se adhiere al estándar posix. –

+3

@Als: las bibliotecas de Posix son un conjunto de extensiones para el estándar C (y C++). Entre las cosas que agregan están 'off_t' y las funciones de archivo que lo usan, como' lseek'. Entonces, no, C/C++ no se adhiere a Posix. De todos modos, Posix es una especificación para un sistema operativo en lugar de un solo lenguaje de programación: además de bibliotecas, incluye, por ejemplo, utilidades de shell y shell, que están más allá del alcance del estándar C (si lo desea, Posix continúa donde el estándar definición de 'sistema' deja de funcionar). –

+3

Y usar 'off_t'" es portable "si ya está usando' mmap', también es una función de Posix. Es un código Posix portátil, no es un código portátil de C++. –

Cuestiones relacionadas