Принципы объектно-ориентированного программирования

         

Оператор sizeof



sizeof

Оператор sizeof применяется для получения размера указанного типа в байтах. При этом помните о двух исключительно важных факторах. Во-первых, sizeof можно применять только к размерным типам. Следовательно, хотя его можно использовать для членов классов, для классов как таковых его применять нельзя. Во-вторых, sizeof можно применять только в методах или блоках кода, помеченных как unsafe. С кодом такого рода мы познакомимся в главе 17. Вот пример использования оператора sizeof в методе класса, помеченного как unsafe:


using System;

class BasicTypes {

// Примечание: Код, использующий оператор sizeof, // должен быть помечен как unsafe, static unsafe public void ShowSizesQ {

Console.WriteLine("\nPa3Mephi основных типов"); Console.WriteLine("Pa3Mep short = {0}", sizeof(short)); Console.WriteLine("Pa3Mep int = {0}", sizeof(int)); Console.Writel_ine("Pa3Mep long = {0}", sizeof(long)); Console.WriteLine("Pa3Mep bool = {0}", sizeof(bool)); } }

class UnsafeUpp

{

unsafe public static void MainQ

{

BasicTypes.ShowSizes();

} }

Вот результат выполнения этого приложения:

Размеры основных типов Размер short = 2 Размер int = 4 Размер long = 8 Размер bool = 1

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

// Использование оператора sizeof. using System;

struct StructWithNoMembers

{

}

struct StructWithMembers

{

short s;

int i;

long 1;

bool b; }

struct CompositeStruct

{

StructWithNoMembers a; StructWithMembers b;

StructWithNoMembers c; }

class UnSafe2App {

unsafe public static void Main() { Console.WriteLine("\nPa3Mep StructWithNoMembers structure = {0}",

sizeof(StructWithNoMembers)); Console.WriteLine("\nPa3Mep StructWithMembers structure = {0}",

sizeof(StructWithMembers)); Console.WriteLine("\nPa3Mep CompositeStruct structure = {0}",

sizeof(CompositeStruct)); } }

Хотя можно предположить, что это приложение выведет 0 для структуры без членов (StructWithNoMembers), 15 для структуры с четырьмя членами базовых типов (StructWithMembers) и 15 для структуры, агрегирующей две предыдущие (CompositeStruct), в действительности результат будет таким:

Размер StructWithNoMembers structure = 1 Размер StructWithMembers structure = 16

Размер CompositeStruct structure = 24

Объяснение этому — способ сохранения конструкции struct компилятором в выходном файле, при котором компилятор применяет выравнивание и дополнение пробелами. Например, если структура имеет размер 3 байта и установлено выравнивание по 4-байтным границам, компилятор автоматически добавит в структуру 1 байт, и оператор sizeof укажет, что размер структуры — 4 байта. Не забывайте это учитывать при определении размера структур в С#.



Содержание раздела