2015-06-05 7 views
3

я написал код и получить странное result- целое я в 8:Почему sizeof (Point) равен 8?

unsafe 
     { 
      int i = sizeof(Point); 
     } 

После проверки структуры Точку я нашел это поля:

public bool IsEmpty { get; } 
    public int X { get; set; } 
    public int Y { get; set; } 

биты математике: 32 + 32 + 1 = 65 бит, так что> 8 байтов

Итак, почему sizeof возвращает 8, но не 9?

Благодаря

ответ

10

IsEmpty является свойство, а не поле. Свойства - это просто методы за кулисами, поэтому они не являются частью размера структуры.

+0

Да, вы пишите! i попытался сделать: struct SomeVal { public Int32 x; public Int32 y; public bool z; } и размер 12! самый маленький блок для переменной - 4 байта? – zzfima

+2

@zzfima Нет ... Попробуйте 'struct Test {bool Value; } '1 байт. То, что вы видите, является дополнительным дополнением, вызванным тем, что 'SomeVal' должен быть выровнен на границе 4 байта (поскольку он содержит' Int32'), поэтому его размер должен быть кратным 4. – xanatos

+2

Обратите внимание, что требования к заполнению зависят от платформы и CLR не имеет одинаковых правил в отношении порядка членов, так как C и C++ имеют, иногда выделяя большую часть необходимого дополнения. – Joey

5

framework implementation из Point использует только два атрибута:

private int x; 
private int y; 

Empty реализуется как

[Browsable(false)] 
public bool IsEmpty { 
    get { 
     return x == 0 && y == 0; 
    } 
} 

Два int поля занимают 8 байт - и все в порядке.

Смежные вопросы