Каковы различия в использовании между size_t и off_t?
Помимо размера значений, которые могут хранить каждый тип, каковы основные различия в использовании между size_t
и off_t
? Является ли это просто соглашением, что типы size_t
используются для абсолютных размеров, а для смещений используются типы off_t
? Или он идет глубже, чем это?
Я пишу класс-оболочку, чтобы включить запись больших файлов с помощью mmap
, и я хочу знать, какие лучшие типы использовать для своих аргументов. Учитывая, что я хочу писать в файлы > 4 ГБ, у меня возникает соблазн использовать 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)
Ответы
Ответ 1
size_t
для объектов, off_t
для файлов.
mmap
объединяет две концепции, в значительной степени по определению. Лично я думаю, что я бы использовал size_t
, так как независимо от того, что еще это такое, сопоставленный файл также является массивом в (виртуальной) памяти.
size_t
является стандартным С++, off_t
является Posix, а off64_t
является расширением GNU, которое идет с функциями fopen64
, ftello64
и т.д. Я думаю, что он всегда должен быть того же типа, что off_t
на 64-битных системах GNU, но не делайте ставку на эту компанию без проверки.
Если это важно, off_t
подписывается, а size_t
- без знака. Но подписанный аналог size_t
равен ptrdiff_t
, поэтому, когда вам нужен подписанный тип, он автоматически не означает, что вы должны использовать off_t
или off64_t
.
Ответ 2
size_t
является частью стандартов С++ (и C) и относится к типу выражения sizeof
. off_t
определяется стандартом Posix и относится к размеру файла.