sizeof (значение) против sizeof (тип)?

Учитывая:

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);

Два синтаксиса различны или строго эквивалентны? Все ли они оцениваются во время компиляции? Если нет, какой из них оценивается во время выполнения?

4

Решение

Разница лишь в синтаксисе и удобстве.

Синтаксически, вы можете оставить скобки в одном случае, но не в другом:

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 работает отлично.

18

Другие решения

Последний определяется с точки зрения первого. Для данного выражения он возвращает размер типа выражения. Так sizeof(vec) переводит на sizeof(std::vector<int>),

Оба оцениваются во время компиляции; единственное время выполнения sizeof находится в C, а не в C ++, с массивами переменной длины. Операнд для sizeof не оценивается, поэтому нет никакого реального, возможно, само выражение могло бы генерировать код в любом случае.

Я предпочитаю использовать выражения над типами, потому что есть вероятность, что тип в некотором роде избыточен.

2

Всякий раз, когда вы используете sizeof(<whatever>)всегда вычисляется во время компиляции. Это тип данных параметра, который sizeof связана с.

Однако вы можете передавать значения и даже выражения в качестве параметра. Но функция sizeof будет учитывать только тип данных переданного параметра.

Вы также можете передавать выражения как sizeof(x = x+1);, Сказать x был инт. В этом случае это sizeof вернусь 4(как на моей машине) и значение х останется неизменным. Это потому что sizeof всегда оценивается во время компиляции.

Предоставленные вами два набора синтаксиса будут возвращать один и тот же результат, но вы не можете сказать, что они эквивалентны. Но да, последний определяется в терминах первого.

2