Интерес представляет также использование «пустого» класса в качестве поля другого класса. Если вы думаете, что «пустые» классы не имеют практического применения, то вы заблуждаетесь: очень часто с помощью «пустого» класса объявляется новый тип исключения.
Поэтому добавим в нашу программу следующие строки: // в объявлении классов
class ct20 { ctl а; }; struct st20 { ctl a; };
class ct21 { stl a; }; struct st21 { stl a; };
class ct22 { ctl a.b; }; struct st22 { ctl a.b; };
class ct23 { ctl a.b; int d; }; struct st23 { ctl a.b; int d; };
// в функции main
cout << "Empty in "<< endl:
cout << "class "<< sizeof(ct20) << "; structure " << sizeof(st20) << endl: cout << "class "<< sizeof(ct21) << "; structure " << sizeof(st21) << endl: cout << "class "<< sizeof(ct22) << "; structure " << sizeof(st22) << endl: cout << "class "<< sizeof(ct23) << structure " << sizeof(st23) << endl:
И снова мы получаем разные результаты в системах Visual С++ и в С++ Builder. В первой при наличии директивы #pragma на экран выводится следующее:
structure 1
structure 1
structure 2
structure 6
Empty ' in class 1 class 1 class 2 class 6
Это означает, что каждое «пустое» поле добавляет в класс 1 байт. В системе С++ Builder получаем несколько другой результат:
Empty in
class 1; structure 1 class 1: structure 1 class 1: structure 1 class 4; structure 4
Это означает, что в С++ Builder в отладочном режиме по умолчанию «пустое» поле не занимает место в классе — как был размер пустого класса равен 1, так и остался, несмотря на наличие «пустых» полей. Можно сказать, что по умолчанию компилятор Borland проводит оптимизацию пустого класса [28J. Однако можно установить режим трансляции, при котором «пустые» поля будут вести себя точно так же, как в Visual С++.
При «выключении» выравнивания ситуация по умолчанию остается аналогичной. В системе Visual C++.NET 2003 получаем на экране
Empty in
class 1
class 1
class 2
class 8
structure 1
structure 1
structure 2
structure 8
Вывод С++ Builder 6:
Empty
class 8
class 8
class 8
class 8
in
structure 8
structure 8
structure 8
structure 8
Таким образом, и в этом случае система С++ Builder 6 по умолчанию не тратит место на «пустые» поля. |