Подтвердить что ты не робот

Каковы различия в использовании между 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)
4b9b3361

Ответ 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 и относится к размеру файла.