Мотивация для использования size_t uint32 uint64 и т. Д. - PullRequest
10 голосов
/ 26 августа 2011

Когда я читаю некоторый код, для целого числа, они используют связку другого типа, такую ​​как size_t, uint32, uint64 и т. Д. Какова мотивация или цель сделать это?Почему бы просто не использовать int?Связано с платформой-кроссом?Или относящиеся к низкому уровню.

Иногда код имеет смысл для меня, потому что они просто хотят 32-битный int или что-то в этом роде.Но что такое size_t?Пожалуйста, помогите мне прояснить это.

Ответы [ 5 ]

15 голосов
/ 26 августа 2011

Они предназначены для независимости от платформы.

size_t по определению является типом, возвращаемым sizeof.Он достаточно большой, чтобы представлять самый большой объект в целевой системе.

Не так много лет назад 32 бита было бы достаточно для любой платформы.64 бит сегодня достаточно.Но кто знает, сколько бит понадобится через 5, 10 или 50 лет?

Писать свой код не важно - т. Е. Всегда использовать size_t, когда вы имеете в виду «размер объекта»- вы можете написать код, который на самом деле будет компилироваться и выполняться через 5, 10 или 50 лет.Или, по крайней мере, иметь шанс на победу.

Используйте типы, чтобы сказать, что вы имеете в виду.Если по какой-то причине вам требуется определенное количество битов (возможно, только при работе с внешним форматом), используйте тип с определенным размером.Если вы хотите что-то, что является «естественным размером слова машины» - то есть, быстро - используйте int.

Если вы имеете дело с такой программой, как sizeof или strlen, используйтетип данных, соответствующий этому интерфейсу, например size_t.

. Никогда не пытайтесь назначить один тип другому, если он не достаточно велик для хранения значения по определению.

3 голосов
/ 26 августа 2011

Мотивация их использования заключается в том, что нельзя полагаться на int, short или long, чтобы иметь какой-то конкретный размер - ошибка, допущенная слишком многими программистами слишком много разв прошлом.Если вы посмотрите не слишком далеко назад в истории, произошел переход с 16-битных на 32-битные процессоры, которые сломали много кода, потому что люди ошибочно полагали, что int - 16-битные.Впоследствии та же ошибка была допущена, когда люди полагались на int как 32-битные, и продолжают делать это даже по сей день.

Не говоря уже о том, что int, short и long имеютбыли действительно обстреляны языковыми проектировщиками, которые все решили заставить их означать что-то другое.Java-программист, читающий некоторый C, наивно ожидает, что long будет означать 64 бита.Эти термины действительно бессмысленны - они ничего не определяют о типе, и я сталкиваюсь каждый раз, когда вижу новый выпущенный язык, который все еще использует термины.

Стандартные типы int были необходимостью, поэтому вы можете использоватьтип, который вы хотите использовать.Они должны были устареть int, short и long десятилетия назад.

2 голосов
/ 26 августа 2011

Информацию о size_t см. В вопросе переполнения стека: Что такое size_t в C?

Вы подходите для uint32 и uint64, поскольку они просто конкретизируют числобитов, которые им нужны, и которые компилятор должен интерпретировать как неподписанные.

1 голос
/ 26 августа 2011

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

Преимущество size_t в том, что оно не подписано. С одной стороны, было бы хорошо использовать size_t, потому что он добавляет больше информации о том, каким должен быть аргумент (т.е. не negitave). С другой стороны, он меньше связан с unsigned int.

1 голос
/ 26 августа 2011

Существует множество возможных причин выбора базового типа для целочисленного значения. Наиболее очевидным является размер максимально возможного значения, которое вы можете сохранить - uint32 сможет хранить число, в два раза большее, чем int32, что может быть желательно. int64 сможет хранить число, намного большее, чем int32 - до 2 ^ 63 - 1 вместо 2 ^ 31 - 1.

Есть и другие возможные причины. Если вы непосредственно читаете двоичные данные из какого-либо источника (файла, сокета и т. Д.), Необходимо убедиться, что они интерпретируются правильно. Если кто-то пишет uint32, а вы интерпретируете его как int32, возможно, что очень большое положительное число интерпретируется как отрицательное число (переполнение).

size_t - это просто typedef для неподписанного целого числа, как мне кажется, 32-битный.

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