Хорошо ли использовать size_t в С++?
Я видел, как люди использовали size_t
, когда они означают целое число без знака. Например:
class Company {
size_t num_employees_;
// ...
};
Это хорошая практика? Одно дело - включить <cstddef>
. Должно ли это быть unsigned int
? Или даже просто int
?
Просто использование int
звучит привлекательно для меня, так как он избегает таких глупых ошибок (потому что люди часто используют int
):
for(int i = num_employees_ - 1; i >= 0; --i) {
// do something with employee_[i]
}
Ответы
Ответ 1
size_t
может иметь разный размер до int
.
Для таких вещей, как количество сотрудников и т.д., эта разница обычно несущественна; как часто бывает более 2 ^ 32 сотрудников? Однако, если вы хотите указать размер файла, вам нужно использовать size_t
вместо int
, если ваша файловая система поддерживает 64-разрядные файлы.
Знайте, что размеры объектов (полученные sizeof
) имеют тип size_t
, а не int
или unsigned int
; также, соответственно, существует ptrdiff_t
для разницы между двумя указателями (например, &a[5] - &a[0] == ptrdiff_t(5)
).
Ответ 2
Использование size_t во многих ситуациях помогает с переносимостью. size_t не всегда "unsigned int", но всегда это размер, который может представлять собой максимально возможный объект на данной платформе. Например, некоторые платформы имеют 16-разрядный целочисленный размер, но используют 32-разрядные указатели. В этом случае, если вы используете unsigned int для размера чего-то, вы ограничите его до 65 536 байт (или других элементов), даже если платформа может обрабатывать нечто гораздо большее.
В вашем примере я бы, вероятно, использовал typedef для 32-битного или 64-разрядного целого числа без знака, а не с использованием int или unsigned int или size_t.
Ответ 3
В вашем случае не используйте ни один из них. Либо используйте контейнер и итераторы, либо создайте новый тип данных (например, базу данных сотрудников), который предлагает доступ к итератору/диапазону.
Что касается unsigned, Bjarne Stroustrup написал в TCPL:
Беззнаковые целые типы идеально подходят для использования, которые обрабатывают хранилище как бит-массив. Использование unsigned вместо int для получения еще один бит для представления положительных целых чисел почти никогда не является хорошим идея. Попытки обеспечить, чтобы некоторые ценности были положительными, объявив переменные без знака, как правило, будут побеждены неявным правила преобразования.
Ответ 4
Вы всегда можете использовать такие вещи, как
employeeList.size();
или
EmployeeList::size_type i = 0;
или
EmployeeNumber number = employee.getNumber();
Я имею в виду инкапсулировать ints и другие типы, подобные этому, если это не просто некоторые внутренние вычисления или алгоритм.
Ответ 5
size_t специально предназначен для указания размера памяти (в байтах) значения. Это тип sizeof выражений.
С этой целью вы должны использовать только size_t, для других вещей вы должны использовать int или определить свой собственный тип.
См. также Wikipedia.
Ответ 6
В этом случае я использовал бы unsigned int
или int
. size_t
- это, по-видимому, прежде всего для представления размера структур данных. Концептуально, в то время как количество сотрудников может быть в некоторых случаях размером структуры данных, это необязательно; это может быть просто счет. Поэтому я бы использовал int
, но я, вероятно, не стал бы слишком сильно нажимать.
Ответ 7
Я не профессионал, но я использую size_t
для размеров памяти для повышения удобочитаемости кода. В каждом другом случае я использую unsigned int
(или что-то еще).
Ответ 8
Вы не хотите использовать простой int в этом случае, потому что количество сотрудников никогда не является отрицательным, и вы хотите, чтобы ваш компилятор помог вам выполнить это правило, правильно?