Если тип переменной будет изменен, sizeof не потребует изменения, если переменная будет аргументом, а не типом.
Относительно комментария @icepack: возможность или вероятность изменения для типа по сравнению с именем переменной не являются проблемой. Предположите, что имя переменной используется в качестве аргумент sizeof и затем позже изменилось. В лучшем случае осуществление рефакторинг - переименовывает операционные изменения, все случаи и никакая ошибка представлены. В худшем случае пропущен экземпляр sizeof, и компилятор жалуется, и Вы фиксируете его. Если тип изменяется, Вы сделаны, никакая возможность ошибок в sizeof операторах.
Теперь предполагают, что тип является аргументом sizeof. Если тип переменной изменяется, нет никакого средства кроме контроля для нахождения всего sizeof, касающегося той переменной. Можно искать, но Вы получите хиты для всего несвязанного использования sizeof того же типа. Если по Вам будут скучать, у Вас будет проблема во время выполнения из-за несоответствия размера, которое является намного большей проблемой для нахождения.
В дополнение к тому, что говорит Steve, позвольте мне добавить, что sizeof не оценивает свой операнд. Таким образом, Вы свободны сделать что-либо в нем. Не только Вы еще не можете использовать инициализированные переменные, но и можно разыменовать нулевого указателя, вызвать функции, не определенные, но только заявленные, и сделать любой другой вид материала. Я поощряю Вас всегда использовать версию выражения по причинам, которые Steve объяснил значительно.
Также полагают, что иногда имена типов действительно долги и нечитабельны, просто думают об указателях на функции (особенно в C++). Вместо того, чтобы писать sizeof(my_long_type<weird, stuff>)
Вы просто делаете sizeof t
.
Линии f и ff определенно хуже, чем g и gg. sizeof f
это размер указателя, так как f это точка. Чтобы сделать их эквивалентными, вам нужно написать sizeof *f
(или, для лучшей разборчивости, sizeof(*f)
).
Я склонен использовать sizeof(type)
в выделении памяти, но неизменно sizeof(variable)
при использовании локальной или глобальной переменной. Тем не менее, существует мудрость в совете использовать имя переменной все время.
у меня также было долгое обсуждение (скорее анимируемый время от времени, и оно продлилось в течение дней - мы закончили договоренность разойтись в проблеме) о том, нормально ли использовать sizeof(variable)
или должно ли это быть sizeof variable
; то есть, делает имеет значение, включают ли круглые скобки аргумент sizeof
. Я никогда не встречался с компилятором, который болтает [приблизительно 115], таким образом, я выбираю однородность и всегда использую круглые скобки с sizeof
. Мой коллега был одинаково непреклонен, что круглые скобки не должны использоваться с переменными; это так или иначе существует ценное различие между нотацией с и без круглых скобок. Я не был убежден - я не ожидаю быть убежденным.
На совершенно различном гвозде, несколько других точек [приблизительно 117]:
sizeof(vla)
не являются постоянным временем компиляции. Остерегайтесь! sizeof
, который является неприятностью, но логичный. Взятие размера переменной может привести к неожиданным результатам. Когда переменная является массивом, sizeof (массив) будет возвращать размер массива, а не размер отдельного элемента или размер указателя. Взятие размера указателя вернет размер указателя. Но поскольку массивы обычно представляются в виде указателей при передаче, все может запутаться.
Вы можете видеть небольшую разницу между ними:
foo **ff = malloc(count * sizeof *ff);
foo **gg = malloc(sizeof(foo*) * count);
... но что, если распределение не находится рядом с декларацией? Если я наткнусь на линию типа:
ff = realloc(ff, count * sizeof *ff);
- тогда я вполне уверен, что она правильная, даже не помня типа ff
. Однако, если я вижу это:
ff = realloc(ff, count * sizeof(foo *));
тогда я могу быть несколько подозрительным, и мне нужно посмотреть на тип ff
, чтобы успокоить свое сознание.