The sizeof operator yields the number of bytes in the object
representation of its operand.
The operand is either an expression,
which is an unevaluated operand (Clause [expr]), or a parenthesized
type-id.
The sizeof operator shall not be applied to an expression that
has function or incomplete type,
to the parenthesized name of such
types, or to a glvalue that designates a bit-field.
sizeof(char), sizeof(signed char) and
sizeof(unsigned char) are 1.
The result of
sizeof applied to any other fundamental
type ([basic.fundamental]) is implementation-defined.
When applied to a reference or a reference type, the result is the size
of the referenced type.
When applied to a class, the result is the number of bytes in an object
of that class including any padding required for placing objects of that
type in an array.
The size of a most derived class shall be greater than
zero ([intro.object]).
The result of applying sizeof to a
base class subobject is the size of the base class type.78
When applied to an array, the result is the total number of bytes in the
array.
This implies that the size of an array of n elements is
n times the size of an element.
The lvalue-to-rvalue ([conv.lval]),
array-to-pointer ([conv.array]), and
function-to-pointer ([conv.func]) standard conversions are not
applied to the operand of sizeof.
If the operand is a prvalue,
the temporary materialization conversion ([conv.rval])
is applied.
The actual
size of a base class subobject may be less than the result of
applying sizeof to the subobject, due to virtual base classes
and less strict padding requirements on base class subobjects.