Эта операция выполняется на стадии компиляции. Результатом этой операции является число байтов, необходимое для размещения объекта в памяти. Существует два варианта синтаксиса этой операции. В первом из них единственный операнд операции определяет некоторый тип языка, и он должен быть заключен в скобки:
sizeof ( float ) sizeof ( int )
Во втором операнд задает некоторое выражение и здесь использование скобок необязательно:
sizeof a; sizeof *ip; sizeof array[ i ];
Заметим, что при получении размеров массивов, несмотря на то, что имя массива является указателем, результатом операции sizeof array, где array - имя некоторого массива, является длина в байтах этого массива. Это свойство можно использовать для вычисления числа элементов в массиве:
const n = 20; int array [n]; . . . int num=sizeof array / sizeof(int) // num = = 20.
Результатом операции sizeof над ссылкой является длина типа, с которым сопоставлена ссылка, т.е. sizeof( double & ) и sizeof( double ) эквивалентны.
Наверняка, вы предполагаете, что размер структуры равен сумме размеров ее членов. Это не так. Вследствие выравнивания объектов разной длины в структуре могут появляться безымянные "дыры". Так, например, если переменная типа char занимает один байт, а int - четыре байта, то для структуры:
#include <iostream> using namespace std; struct Test { char c; int i; }; void main () { Test d={'#',78}; cout<<sizeof(Test)<<" "<<sizeof(d)<<"\n\n"; }
может потребоваться восемь байт, а не пять. Правильное значение возвращает операция sizeof.