разница (ы) между size_t и sizeof - PullRequest
0 голосов
/ 18 декабря 2010

В чем различия между

malloc ( sizeof ( char ) * N ) 

и

size_t datalen = N 
malloc ( datalen  ) 

Где мы должны использовать size_t вместо sizeof ( char ) и наоборот?

Есть ли разница в производительности между size_t и sizeof ( char )?

Ответы [ 4 ]

3 голосов
/ 18 декабря 2010

size_t - это целочисленный тип без знака, который гарантированно поддерживает самый длинный объект для используемой вами платформы. Это также результат оператора sizeof.
sizeof возвращает размер типа в байтах.
Таким образом, в вашем контексте вопроса в обоих случаях вы передаете size_t malloc

1 голос
/ 18 декабря 2010

Это все равно, что спросить, есть ли различия в производительности между литералом 42 и типом int; это разные вещи.

Вы используете sizeof(T), чтобы получить количество байтов, которое использует объект T. Это в основном полезно для malloc / calloc / realloc.

Вы используете size_t в качестве типа для хранения этого числа.

size_t datalen = N * sizeof(char);
char* pBuf = malloc(datalen);
1 голос
/ 18 декабря 2010

Он не возвращает буквально значение типа size_t, поскольку size_t не является конкретным типом сам по себе, а скорее typedef для неопределенного встроенного типа.Идентификаторы Typedef (например, size_t) полностью эквивалентны соответствующим базовым типам (и преобразуются в них во время компиляции).Если size_t определен как unsigned int на вашей платформе, то sizeof возвращает unsigned int, когда он компилируется в вашей системе.size_t - это просто удобный способ сохранить переносимость, и его нужно включать в stddef.h только если вы используете его явно по имени.

Этот ответ является копией этого ответа ;Первоначально он был написан пользователем Volte.

0 голосов
/ 18 декабря 2010

В вашем примере полезность не является ни особенно очевидной, ни убедительной, и вопрос и код ошибочны - что, если тип изменится?datalen = N будет неадекватного размера.Есть лучшая идиома, которая лучше использует sizeof;sizeof (char) не имеет смысла, потому что по определению он равен 1 (хотя CHAR_BIT не обязательно должен быть 8)

Если тип данных динамического массива должен был измениться, и вы разместили в блоках sizeof (объект), а неsizeof (type), тогда ваш код станет более легко обслуживаемым.

например,

char* data = malloc(sizeof(*data) * N ) ;

, тогда, если позже вы решите, что данные должны быть int, например:

int* data = malloc(sizeof(*data) * N ) ;

только одно изменение вместо двух (или еще больше каждый раз, когда необходим размер).Это особенно полезно для структур и пользовательских типов:

tSomeType* data = malloc(sizeof(*data) * N ) ;

, где вы можете изменять размер типа, добавляя или удаляя элементы, например.

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