| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Получить размер структуры, представить байтами |
| Автор: Lexicss 10.6.2009, 12:39 | ||||
привожу фрагмент кода:
Структура имеет 3 байтовых элеменат и 1 двухбайтовый. Итого её размер должен составлять 5 байт. С помощью sizeOf() получаю неуправляемый размер 6. Почему?
когда выстраиваю структуру rc2 в виде массива байт то получаю результат [1,0,13,0,2,3] Откуда в этом массиве берётся первый ноль? И почему его длина составляет 6, а не 5? P.S. : если из структуры убрать элемент len, то её размер становится верный - 3 байта. В чём тут суть такого фокуса и как его обойти? |
| Автор: DVariuS 10.6.2009, 13:01 | ||||
Lexicss, это из-за выравнивания данных в памяти, смотри:
а это строка в памяти, содержащая твою структуру:
Байты могут располагаться в памяти один за другим, а вот для размещения слова (word) компилятор берет следующий четный адресс. Это связано с оптимизацией для увеличения быстродействия, подробней можешь прочитать в любой книге по ассемблеру. При программировании на C# такие низкоуровневые моменты лучше не затрагивать, т.к. язык предназначен для других целей. |
| Автор: PashaPash 10.6.2009, 14:47 |
| Lexicss, почитай про StructLayoutAttribute |
| Автор: Partizan 10.6.2009, 15:10 |
| PashaPash, StructLayout разве влияет на размер структуры в managed-памяти? я тут поигрался - результат всё тот же - sizeof выдаёт 6 байт...однако при копировании в unmanaged-блок памяти объект вполне себе и в 5 байт умещается... |
| Автор: PashaPash 10.6.2009, 16:06 |
| Partizan, Marshal.SizeOf возвращает unmanaged size of an object in bytes. Покажи пример играния |
| Автор: Partizan 10.6.2009, 16:37 | ||
PashaPash,
Добавлено через 3 минуты и 14 секунд А, всё...понял почему...Не выставил параметр атрибута Size если Size выставить значение 5, то всё ок. |