Ответ 1
Я думаю, это просто, хотя я приветствую стропы и стрелы.
size_t
следует использовать, если он описывает то, что имеет размер. (Число. Несколько вещей)
В настоящее время я перерабатываю некоторые виды использования unsigned int
to size_t
в моей кодовой базе, которую я разрабатывал на протяжении многих лет. Я понимаю, что разница между двумя и тем, например, unsigned int
может быть 32-битной, а указатели и size_t
могут быть 64-битными. Мой вопрос - это больше о том, где я должен использовать один из них и что люди используют для выбора между ними.
Совершенно очевидно, что в качестве аргумента распределение памяти должно принимать size_t
вместо unsigned int
, или что классы-контейнеры должны использовать size_t
для размера и индексирования, как в STL. Это распространенные случаи, связанные с чтением преимуществ size_t
vs unsigned int
. Однако, работая над преобразованием базы кода, я наткнулся на довольно много случаев в серых областях, где я не уверен, какой из них использовать. Например, если индекс строки/столбца матрицы 4x4 должен быть size_t
для согласованности, независимо от индекса, находящегося в диапазоне [0, 3], или если разрешение экрана/текстуры должно использовать size_t
, несмотря на то, что оно находится в диапазоне нескольких тысяч или в если разумное число объектов должно находиться в диапазоне десятков, я должен использовать size_t
для согласованности.
Какие соглашения о кодировании вы используете для выбора между unsigned int
и size_t
? Должно ли все, что представляет размер (в байтах или объектах), или индекс всегда size_t
независимо от разумно ожидаемого диапазона? Существует ли общепринятое соглашение size_t
, используемое в хорошо зарекомендовавших себя библиотеках, которые я мог бы выполнить?
Я думаю, это просто, хотя я приветствую стропы и стрелы.
size_t
следует использовать, если он описывает то, что имеет размер. (Число. Несколько вещей)
С 32 до 64-битным портом некоторого старого кода, который, как мне кажется, ключевая характеристика size_t в моем сознании заключается в том, что он всегда достаточно велик, чтобы представлять все ваше адресное пространство.
Любой другой тип, который вы можете назвать (включая unsigned long), может потенциально создать искусственный предел для ваших структур данных в какой-то момент в будущем. size_t (и его кузен ptrdiff_t) должен быть основой по умолчанию для построения структуры данных, если вы не можете определить жесткую априорную верхнюю границу домена.
Для меня вопрос о том, используете ли вы целое число, которое меньше архитектурной ширины, - это вопрос, можете ли вы доказать, что меньшего размера будет достаточно.
Возьмем, к примеру, вашу матрицу 4x4: есть ли теоретическая причина, почему она должна быть 4x4, а не, скажем, 5x5 или 8x8? Если есть такая теоретическая причина, у меня нет проблем с меньшим целым типом. Если их нет, используйте size_t
или другой тип, который по крайней мере имеет ширину.
Мое рассуждение состоит в том, что фиксированные лимиты (и фиксированные целочисленные размеры - только один из способов их введения), как правило, спящие ошибки. Кто-то, когда-нибудь, вероятно, найдет какой-то крайний прецедент, в котором предположения, сделанные вами для исправления лимита, не выполняются. Поэтому вы хотите избежать их, где бы они ни возникали. И так как я вообще не удосужился сделать доказательство для меньшего размера (потому что это бессмысленно относительно производительности), я обычно заканчиваю использование целых чисел полного размера.