Учитывая:
double data;
double array[10];
std::vector<int> vec(4, 100);
MyClass myclass;
Есть ли разница между:
sizeof(double);
sizeof(double[10]);
sizeof(std::vector<int>);
sizeof(MyClass);
а также
sizeof(data);
sizeof(array);
sizeof(vec);
sizeof(myclass);
Два синтаксиса различны или строго эквивалентны? Все ли они оцениваются во время компиляции? Если нет, какой из них оценивается во время выполнения?
Разница лишь в синтаксисе и удобстве.
Синтаксически, вы можете оставить скобки в одном случае, но не в другом:
double d;
sizeof(double); // compiles
sizeof(d); // compiles
sizeof d; // compiles
sizeof double; // does NOT compile
Что касается удобства, рассмотрим что-то вроде:
float a;
x = sizeof(float);
y = sizeof(a);
Если, например, вы когда-нибудь меняете a
из float
на двойной, вам также нужно изменить sizeof(float)
в sizeof(double)
чтобы соответствовать. Если вы используете sizeof(a)
повсюду, когда вы меняете a
из float
к double
, все ваши использования sizeof
тоже будет автоматически меняться, без какого-либо редактирования. Последнее чаще является проблемой в C, чем в C ++, например, при вызове malloc:
float *a = malloc(10 * sizeof(float));
против
float *a = malloc(10 * sizeof(*a));
В первом случае меняем первый float
в double
создаст код, который компилируется, но имеет переполнение буфера. Во втором случае меняется (только) float
в double
работает отлично.
Последний определяется с точки зрения первого. Для данного выражения он возвращает размер типа выражения. Так sizeof(vec)
переводит на sizeof(std::vector<int>)
,
Оба оцениваются во время компиляции; единственное время выполнения sizeof
находится в C, а не в C ++, с массивами переменной длины. Операнд для sizeof
не оценивается, поэтому нет никакого реального, возможно, само выражение могло бы генерировать код в любом случае.
Я предпочитаю использовать выражения над типами, потому что есть вероятность, что тип в некотором роде избыточен.
Всякий раз, когда вы используете sizeof(<whatever>)
всегда вычисляется во время компиляции. Это тип данных параметра, который sizeof
связана с.
Однако вы можете передавать значения и даже выражения в качестве параметра. Но функция sizeof будет учитывать только тип данных переданного параметра.
Вы также можете передавать выражения как sizeof(x = x+1);
, Сказать x
был инт. В этом случае это sizeof
вернусь 4
(как на моей машине) и значение х останется неизменным. Это потому что sizeof
всегда оценивается во время компиляции.
Предоставленные вами два набора синтаксиса будут возвращать один и тот же результат, но вы не можете сказать, что они эквивалентны. Но да, последний определяется в терминах первого.