Являются ли итераторы :: разностными типами системы независимыми - PullRequest
2 голосов
/ 25 октября 2011

У меня есть логика сериализации, в которой я также сериализую структуры данных stl.В настоящее время я просто пишу поле размера, а затем итерирую каждый элемент структуры.В десериализации я читаю поле размера, а затем знаю, когда я закончила читать структуру данных.

Нет, вопрос в том, как правильно написать поле размера и независимо от системы.В настоящее время я использую std::iterator_traits<const_iterator>::difference_type как тип для хранения в файле.Однако я не уверен, гарантированно ли этот тип является независимым от системы или может измениться, когда я пытаюсь обмениваться файлами между различными системами.

Я посмотрел на этот тип для std::string и вв этом случае sizeof(std::iterator_traits<std::string::const_iterator>::difference_type) возвращает 8 на 64-битной машине.Так что я думаю, что в этом случае это просто typedef для size_t, который занимает одно слово.В настоящее время у меня нет доступной 32-битной машины, поэтому я не могу проверить, не отличается ли ее размер от этого.

Гарантируется ли это стандартом как переносимость, или я должен использовать какой-либо фиксированный тип для всех данныхструктуры здесь для кодирования длины?

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

Смысл всех этих typedefs в том, что вам не необходимо исправлять тип глобально!

Для сериализации вам придется решить и исправить ваш сериализованный формат.В этот момент вы можете просто потребовать, чтобы размер вписывался в 32-разрядное целое число, проверить, соответствует ли данный размер, и преобразовать.Если есть ошибка, вы можете просто позволить вашей сериализации провалиться (например, «структура данных не сериализуема»).Если вы считаете, что это необходимо, сделайте поле размера 64-битным, и у вас должно быть много возможностей, но вы сами должны взвесить пространство в сравнении с гибкостью и профилем использования.Будете ли вы иметь контейнеры с более чем 4 миллиардами элементов и записывать их на диск?

Сериализация - это принятие решений и публикация рецептов, и вам придется мириться с возможными сбоями импорта и экспорта и учитывать их.

2 голосов
/ 25 октября 2011

difference_type определяется стандартом как «целочисленный тип со знаком» (20.1.5, таблица 32) и должен быть typedef типа ptrdiff_t (20.1.5 / 4), которыйв свою очередь, определяется реализацией (5.7 / 6).

Так как общий знаменатель здесь в том, что он может быть преобразован в «целочисленный тип со знаком», если вам нужно сериализовать это значение, я бы порекомендовал static_cast, что-то вроде long и сохранение этого.

2 голосов
/ 25 октября 2011

Гарантируется ли это стандартом как переносимость, или я должен использовать некоторый фиксированный тип для всех структур данных здесь для кодирования длины?

Нет, он не переносим, ​​ида, вы должны использовать какой-то тип фиксированного размера.Для большинства приложений 32-разрядное целое число должно подойти.Обратите внимание, что, в зависимости от вашего кода сериализации и требований переносимости, вы также можете столкнуться с проблемами порядка байтов (little-endian против big-endian).

Для получения дополнительной информации и передового опыта, смотрите документацию QtQDataStream.Люди из Qt рекомендуют выбирать целочисленный тип фиксированного размера (например, qint32), а затем приводить его соответствующим образом при сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...