За исключением случаев использования массивов переменной длины, sizeof
- это 100% время компиляции. Таким образом, нет «эффективности», за исключением косвенно в отношении удобочитаемости, понятности, безопасности и т. Д.
Я предпочитаю версию с наименьшим повторением, а также с наименьшей типизацией. Таким образом, если имеется указатель, я всегда использую третью форму, но без скобок, так как они не нужны.
Например:
float *a = malloc(1000 * sizeof *a);
Следует отметить, что код, как это «блокирует» sizeof
к указателю используется, что, по крайней мере slighly лучше (я бы утверждать, что это намного лучше, так как типичные функции имеют меньше указателей в области, чем у них есть имена типов), чем повторение типа, так как соответственно уменьшается риск неправильного сопоставления.
Скобки в коде, такие как sizeof(float)
или ваш sizeof(A)
, нужны только тогда, когда аргумент является именем типа. Так как он выглядит, как вызов функции, которой нет, когда я должен использовать эту форму, я всегда форматировать его с пространством:
void *p = malloc(1000 * sizeof (float));
Помните, что sizeof
не является функцией.
Способ 2 намного медленнее, чем метод 1, но метод 3 занимает намного больше памяти. Я думаю, что метод 1 есть O (N^2). –
Все они вычисляются во время компиляции. Что вы подразумеваете под «эффективностью»? –
sizeof - это время компиляции, так что он оптимизирован во всех 3 случаях. –