Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить размер структуры, представить байтами, Получаю неверный размер структуры 
:(
    Опции темы
Lexicss
Дата 10.6.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 16.8.2006
Где: Беларусь, Минск

Репутация: нет
Всего: 1



привожу фрагмент кода:
Код

        struct RecLogon2
        {
            public byte b1;
            public ushort len;
            public byte b2;
            public byte b3;
        }

Структура имеет 3 байтовых элеменат и 1 двухбайтовый. Итого её размер должен составлять 5 байт.

С помощью sizeOf() получаю неуправляемый размер 6. Почему?
Код

               RecLogon2 rc2;
               rc2 = new RecLogon2();
               rc2.b1 = 1;
               rc2.len = 13;
               rc2.b2 = 2;
               rc2.b3 = 3;

               int sz = Marshal.SizeOf(rc2);  // sz = 6, а не 5.    ???


когда выстраиваю структуру rc2 в виде массива байт то получаю результат
[1,0,13,0,2,3]

Откуда в этом массиве берётся первый ноль? И почему его длина составляет 6, а не 5? 

P.S. : если из структуры убрать элемент len, то её размер становится верный - 3 байта.


В чём тут суть такого фокуса и как его обойти?

Это сообщение отредактировал(а) Lexicss - 10.6.2009, 12:41
--------------------
Бери от жизни всё.
PM MAIL WWW ICQ Skype   Вверх
DVariuS
Дата 10.6.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: 5
Всего: 8



Lexicss, это из-за выравнивания данных в памяти, смотри:
Код

            rc2.b1 = 1;
0000004c  mov         byte ptr [ebp-44h],1 
            rc2.len = 13;
00000050  mov         word ptr [ebp-42h],0Dh 
            rc2.b2 = 2;
00000056  mov         byte ptr [ebp-40h],2 
            rc2.b3 = 3;
0000005a  mov         byte ptr [ebp-3Fh],3 


а это строка в памяти, содержащая твою структуру:
Код

0x045FECBC  01 00 0d 00 02 03


Байты могут располагаться в памяти один за другим, а вот для размещения слова (word) компилятор берет следующий четный адресс. Это связано с оптимизацией для увеличения быстродействия, подробней можешь прочитать в любой книге по ассемблеру.

Цитата(Lexicss @  10.6.2009,  12:39 Найти цитируемый пост)
В чём тут суть такого фокуса и как его обойти?

При программировании на C# такие низкоуровневые моменты лучше не затрагивать, т.к. язык предназначен для других целей.
PM MAIL   Вверх
PashaPash
Дата 10.6.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



Lexicss, почитай про StructLayoutAttribute


--------------------
PM MAIL WWW   Вверх
Partizan
Дата 10.6.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



PashaPash, StructLayout разве влияет на размер структуры в managed-памяти?

я тут поигрался - результат всё тот же - sizeof выдаёт 6 байт...однако при копировании в unmanaged-блок памяти объект вполне себе и в 5 байт умещается...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PashaPash
Дата 10.6.2009, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



Partizan, Marshal.SizeOf возвращает unmanaged size of an object in bytes. Покажи пример играния  smile


--------------------
PM MAIL WWW   Вверх
Partizan
Дата 10.6.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



PashaPash

Код

    [StructLayout(LayoutKind.Explicit)]
    struct RecLogon2
    {
        [FieldOffset(0)]
        public ushort len;
        [FieldOffset(2)]
        public byte b1;
        [FieldOffset(3)]
        public byte b2;
        [FieldOffset(4)]
        public byte b3;
        
    }

    class Program
    {
        static void Main(string[] args)
        {
            RecLogon2 rc2;
            rc2 = new RecLogon2();
            rc2.b1 = 1;
            rc2.len = 256;
            rc2.b2 = 2;
            rc2.b3 = 3;
            int sz = Marshal.SizeOf(rc2);  // sz = 6, а не 5.    ???
            
            IntPtr memBlock = Marshal.AllocHGlobal(5);
            Marshal.StructureToPtr(rc2, memBlock, false);
            
            RecLogon2 rc = (RecLogon2)Marshal.PtrToStructure(memBlock, typeof(RecLogon2));
            
            sz = Marshal.SizeOf(rc);
            
            Console.Write(sz);//6
        }
    }


Добавлено через 3 минуты и 14 секунд
А, всё...понял почему...Не выставил параметр атрибута Size smile
если Size выставить значение 5, то всё ок.


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0743 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.