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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Упаковка структур 
V
    Опции темы
Gwire
Дата 20.7.2013, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Некоторое время мучился с авто выравниванием структур.
Методом проб было выведено, что C# по умолчанию определяет параметр максимальной длины (sizeof)
и при упаковке "шагает" основываясь именно на этой длине (назовем ее Pack).

IMHO абстрактно это происходит так:
C# размечает память устанавливая маркеры с шагом Pack (представляю как "|")
Далее располагает параметры в этой "нарезке", так чтобы параметр не был "разрезан" маркером.
Если места не хватает между предыдущим параметром и маркером ("|"), то параметр размещается за маркером.
На пример:
Код

using System;
using System.Runtime.InteropServices;
. . .
struct strctTest{ Int32 E1; Int16 E2; byte E3; Int32 E4; }
static public void Main() {    Console.WriteLine(  Marshal.SizeOf( new strctTest() )  );    }
. . .
Структура strctTest после упаковки "весит" 12 байт;
Код

{Int32; Int32} = 8                  |****.|****.|
{Int32; byte} = 8                   |****.|*.___|
{Int64; byte} = 16                  |********.|*._______|
{Int64; Int32} = 16                 |********.|****.____|
{byte; Int64} = 16                  |*._______|*********|
{Int32; Int16; Int32} = 12          |****.|**.__|****.|
{Int32; Int16; byte; Int32} = 12    |****.|**.*._|****.|        <------ Из примера
Легенда: "|" - маркер, "." - конец параметра, "*" - полезный байт, "_" - мусор. ("|" и "." не занимают места)

И вот возник вопрос: Как избавится от пробелов ("_")? Искал похожую тему. Нашел эту http://forum.vingrad.ru/topic-262810.html, где описывается как в руками расставит параметры.

"Такой продвинутый язык и расставлять руками? Та ну..."
Вывел вот такое решение:
Код

[StructLayout(LayoutKind.Sequential, Pack=1)]
struct strctTest{ Int32 E1; Int16 E2; byte E3; Int32 E4; }
// {Int32; Int16; byte; Int32} = 11    |*|*|*|*.|*|*.|*.|*|*|*|*.| 
 Теперь структура strctTest после упаковки "весит" 11 байт;
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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