Marshal.SizeOf() возвращает не верный размер!?
От: Александр  
Дата: 28.06.10 07:05
Оценка:
Добрй день!

public struct Test1
{
public long p1;
public int p2;
public IntPtr p3;
public int p4;
}

public struct Test2
{
public long p1;
public int p2;
public IntPtr p3;
//public int p4;
}

int s1 = Marshal.SizeOf(typeof(Test1));
int s2 = Marshal.SizeOf(typeof(Test2));

s1 = 24;
s2 = 16;

Кто-нибуть может объяснить данные результаты?
Re: Marshal.SizeOf() возвращает не верный размер!?
От: Aen Sidhe Россия Просто блог
Дата: 28.06.10 07:06
Оценка:
Здравствуйте, Александр, Вы писали:

А>Кто-нибуть может объяснить данные результаты?


Выравнивание?
С уважением, Анатолий Попов.
ICQ: 995-908
Re[2]: Marshal.SizeOf() возвращает не верный размер!?
От: Александр  
Дата: 28.06.10 07:10
Оценка:
Здравствуйте, Aen Sidhe, Вы писали:

AS>Здравствуйте, Александр, Вы писали:


А>>Кто-нибуть может объяснить данные результаты?


AS>Выравнивание?


Выравнивание чего?
Re[3]: Marshal.SizeOf() возвращает не верный размер!?
От: hexamino http://hexamino.blogspot.com/
Дата: 28.06.10 07:14
Оценка:
Здравствуйте, Александр, Вы писали:

AS>>Выравнивание?


А>Выравнивание чего?


Выравнивание экземплярных полей. Они не обязательно располагаются в структуре непрерывно. Компилятор может вставлять между ними несколько байтов, не нагруженных смыслом (насколько я понимаю, для оптимизации JIT). Это зависит от их порядка и размера.
Re[4]: Marshal.SizeOf() возвращает не верный размер!?
От: Александр  
Дата: 28.06.10 07:31
Оценка:
Здравствуйте, hexamino, Вы писали:

H>Здравствуйте, Александр, Вы писали:


AS>>>Выравнивание?


А>>Выравнивание чего?


H>Выравнивание экземплярных полей. Они не обязательно располагаются в структуре непрерывно. Компилятор может вставлять между ними несколько байтов, не нагруженных смыслом (насколько я понимаю, для оптимизации JIT). Это зависит от их порядка и размера.


ну так как получить натуральный размер структуры?
Re[5]: Marshal.SizeOf() возвращает не верный размер!?
От: Aen Sidhe Россия Просто блог
Дата: 28.06.10 07:33
Оценка:
Здравствуйте, Александр, Вы писали:

А>Здравствуйте, hexamino, Вы писали:


H>>Здравствуйте, Александр, Вы писали:


AS>>>>Выравнивание?


А>>>Выравнивание чего?


H>>Выравнивание экземплярных полей. Они не обязательно располагаются в структуре непрерывно. Компилятор может вставлять между ними несколько байтов, не нагруженных смыслом (насколько я понимаю, для оптимизации JIT). Это зависит от их порядка и размера.


А>ну так как получить натуральный размер структуры?


Что вы понимате под "натуральный размер структуры"?
С уважением, Анатолий Попов.
ICQ: 995-908
Re[5]: Marshal.SizeOf() возвращает не верный размер!?
От: hexamino http://hexamino.blogspot.com/
Дата: 28.06.10 07:33
Оценка:
Здравствуйте, Александр, Вы писали:

А>ну так как получить натуральный размер структуры?


Натуральный — это какой? Сумму размеров полей? Тогда надо доставать список полей через reflection и суммировать.
Re[6]: Marshal.SizeOf() возвращает не верный размер!?
От: Александр  
Дата: 28.06.10 07:44
Оценка:
Здравствуйте, hexamino, Вы писали:

H>Здравствуйте, Александр, Вы писали:


А>>ну так как получить натуральный размер структуры?


H>Натуральный — это какой? Сумму размеров полей? Тогда надо доставать список полей через reflection и суммировать.



Спасибо, разобрался (я считал что sizeof() должен возвращать сумму размеров всех полей,а то что компилятор добавляет байты для выравнивания и не предполагал).
Re[7]: Marshal.SizeOf() возвращает не верный размер!?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 28.06.10 08:20
Оценка: +1
Здравствуйте, Александр, Вы писали:

А>Здравствуйте, hexamino, Вы писали:


H>>Здравствуйте, Александр, Вы писали:


А>>>ну так как получить натуральный размер структуры?


H>>Натуральный — это какой? Сумму размеров полей? Тогда надо доставать список полей через reflection и суммировать.



А>Спасибо, разобрался (я считал что sizeof() должен возвращать сумму размеров всех полей,а то что компилятор добавляет байты для выравнивания и не предполагал).


Смотри [StructLayout(LayoutKind.Sequential)]
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.layoutkind.aspx
Re[8]: Marshal.SizeOf() возвращает не верный размер!?
От: hexamino http://hexamino.blogspot.com/
Дата: 28.06.10 08:35
Оценка:
Здравствуйте, samius, Вы писали:

S>Смотри [StructLayout(LayoutKind.Sequential)]

S>http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx
S>http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.layoutkind.aspx

LayoutKind.Sequential не гарантирует непрерывности в расположении полей, он лишь фиксирует порядок. Кроме того, он и так применяется к структурам по умолчанию.
Впрочем, может быть, ты и хотел намекнуть на это, приведя эти ссылки.
Re[9]: Marshal.SizeOf() возвращает не верный размер!?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 28.06.10 08:41
Оценка:
Здравствуйте, hexamino, Вы писали:

H>Здравствуйте, samius, Вы писали:


S>>Смотри [StructLayout(LayoutKind.Sequential)]

S>>http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx
S>>http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.layoutkind.aspx

H>LayoutKind.Sequential не гарантирует непрерывности в расположении полей, он лишь фиксирует порядок.

Гарантирует при соответствующем StructLayoutAttribute.Pack, который по умолчанию равен 0.

H>Кроме того, он и так применяется к структурам по умолчанию.

По умолчанию применяется Auto.
Re[10]: Marshal.SizeOf() возвращает не верный размер!?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 28.06.10 09:16
Оценка: 16 (2)
Здравствуйте, samius, Вы писали:

H>>Кроме того, он и так применяется к структурам по умолчанию.

S>По умолчанию применяется Auto.

По умолчанию у классов — Auto, у структур — Sequential.
Re[11]: Marshal.SizeOf() возвращает не верный размер!?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 28.06.10 09:23
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, samius, Вы писали:


H>>>Кроме того, он и так применяется к структурам по умолчанию.

S>>По умолчанию применяется Auto.

N>По умолчанию у классов — Auto, у структур — Sequential.


Век живи, век учись, а дураком помрешь (ц).

Спасибо, буду знать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.