sizeof(value) vs sizeof(type)?

c++, compile-time, runtime, sizeof

Solution

The only differences are in syntax and convenience.

Syntactically, you're allowed to leave out the parentheses in one case, but not the other:

double d;

sizeof(double); // compiles
sizeof(d);      // compiles
sizeof d;       // compiles
sizeof double;  // does NOT compile

As far as convenience goes, consider something like:

float a;

x = sizeof(float);

y = sizeof(a);

If, for example, you sometime end up changing `a` from a `float` to a double, you'd also need to change `sizeof(float)` to `sizeof(double)` to match. If you use `sizeof(a)` throughout, when you change `a` from a `float` to a `double`, all your uses of `sizeof` will automatically change too, without any editing. The latter is more often a problem in C than C++, such as when calling malloc:

float *a = malloc(10 * sizeof(float));

vs.

float *a = malloc(10 * sizeof(*a));

In the first case, changing the first `float` to `double` will produce code that compiles, but has a buffer overrun. In the second case, changing the (only) `float` to `double` works fine.

Problem

Considering : ``` double data; double array[10]; std::vector<int> vec(4, 100); MyClass myclass; ``` Is there a difference between : ``` sizeof(double); sizeof(double[10]); sizeof(std::vector<int>); sizeof(MyClass); ``` and ``` sizeof(data); sizeof(array); sizeof(vec); sizeof(myclass); ``` Are the two syntaxes different or strictly equivalent ? Are all of them evaluated at compile-time ? If not, which one is evaluated at run-time ?

Original source