Безопасно ли назначать pos_type для uint64_t при работе с большими файлами (> 2 ГБ)? - PullRequest
2 голосов
/ 06 января 2012

При попытке работать с большими файлами (2 / 4ГБ) кроссплатформенным способом безопасно ли приводить pos_type к uint64_t?

  • Целевые платформы: настольные компьютеры с установленным дистрибутивом Linux, Windows, Mac.
  • Задача: произвольный доступ к двоичным файлам (tellp и seekp).
  • Sought: решение, наиболее близкое к стандартам (POSIX, Win API), портативное и безопасное.

1 Ответ

3 голосов
/ 06 января 2012

На практике или в теории. Что касается стандарта, я не думаю, что есть гарантия, что pos_type даже конвертируется в интегральный тип; по логике, это не должно быть, так как он содержит несколько независимые данные: смещение от начала файла и информация о состоянии для многобайтового декодирования.

На практике, с другой стороны, у вас не должно быть проблем с Машины на базе Unix; в Windows числовое значение не обязательно много значат, если файл открывается в текстовом режиме, но вы можете преобразовать pos_type до uint64_t и обратно без потери стоимости (если нет действительно значимое многобайтовое состояние в оригинале pos_type, но я не знаю ни одной кодировки под Windows, где это было бы так).

Должно быть возможно определить во время компиляции, pos_type будет неявно преобразовывать в целочисленный тип или нет, и использовать это в некоторых вроде static_assert. Я не думаю, что это много покупает, однако; Это не будет определять, можно ли использовать интегральное значение, кроме чтобы вернуться обратно к pos_type. (Это может быть какая-то магия печенье, например. Но я бы не стал сильно беспокоиться об этом. Стандарт допускает много вещей, которые ни одна разумная реализация не будет делать. Просто имейте в виду, что даже под Windows значение не всегда представляет точное количество байтов, которые могут быть прочитаны.

...