2015-02-23 3 views
3

Когда использовать size_t vs uint32_t? Я видел метод в проекте, который получает параметр length (типа uint32_t), чтобы обозначить длину байтовых данных для обработки, и метод предназначен для вычисления CRC полученных байтовых данных. Тип параметра позже был реорганизован на size_t. Есть ли в этом случае техническое превосходство в использовании size_t?Когда использовать size_t vs uint32_t?

например.

- (uint16_t)calculateCRC16FromBytes:(unsigned char *)bytes length:(uint32_t)length; 

- (uint16_t)calculateCRC16FromBytes:(unsigned char *)bytes length:(size_t)length; 
+5

AFAICS, не было бы веской причины для этого. Определенный CRC определяется для работы с определенным размером слова, и это именно то, что 'uint32_t'. Из семантической точки зрения 'size_t' не соответствует явному размеру. –

+0

Я предполагаю, что это потому, что вы хотите, чтобы 'size_t' был самым большим типом данных, который платформа может поддерживать изначально (т. Е. Вы хотите, чтобы большой диапазон оставался быстрым). Например. на 32-битной системе вы хотите, чтобы это было 32 бита, и в 64-битной системе вы хотели бы, чтобы это было 64 бита, но вы бы не хотели, чтобы 'size_t' был 64-разрядным типом на 32-битной системы (или 'uint32_t' на 16-битной системе). В противном случае, вероятно, это просто хороший индикатор, показывающий, что этот параметр представляет собой некоторую величину размера. Я не знаю, почему они специально решили использовать здесь 'size_t'. – tangrs

+0

Спасибо всем - я добавил более подробную информацию. – Boon

ответ

4

Согласно спецификации C

size_t ... это целое число без знака тип результата SizeOf оператора

Таким образом, любая переменная, которая содержит результат sizeof Операция должна быть объявлена ​​как size_t. Поскольку параметр length в прототипе образца может быть результатом операции sizeof, целесообразно объявить его как size_t.

например.

unsigned char array[2000] = { 1, 2, 3 /* ... */ }; 
uint16_t result = [self calculateCRC16FromBytes:array length:sizeof(array)]; 

Можно утверждать, что рефакторинг параметра длины был бесцельно педантичный, так как вы не увидите никакой разницы, если:
а) size_t является более чем 32-бит
б) SizeOf массив более 4 ГБ

+0

** BUT **: Вы можете запускать систему, где 'size_t' - 16 или 64 бит. Размер определяется реализацией. 'uint32_t', OTOH, гарантируется (?) 32 бита в ширину. CRC имеет заданный размер. Выполнение 32-битного CRC на 16-битном 'size_t' вызовет проблемы. –

+0

@ColeJohnson Да и нет. Сначала обратите внимание, что это был параметр 'length', который был изменен. Вы можете применить CRC к любой «длине» данных. Поэтому единственный вопрос заключается в том, следует ли всегда указывать длину слова в виде 32-битного числа или указывать как 'size_t'. Вы можете утверждать, что 'size_t' не будет работать, если a) size_t - 16 бит. B) буфер составляет более 64 КБ. Тем не менее, предполагается, что существуют 16-битные системы, которые запускают объектный C-код. – user3386109

 Смежные вопросы

  • Нет связанных вопросов^_^