Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373

Как скукожить структуру?

20.06.2021, 10:10. Показов 2109. Ответов 4

Студворк — интернет-сервис помощи студентам
Привет всем! Имеется структура RecognitedData:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[StructLayout(LayoutKind.Sequential, Pack = 1)]
    public unsafe struct SimpleRect
    {
        public int Left;
        public int Top;
        public int Width;
        public int Height;
    }
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public unsafe struct RecognitedData
    {
        public SimpleRect BoundingBox;
        public SimpleRect BaseLine;
        public double DeskewAngle;
        public double ConfidencePercent;
        public int BlockType;
        public int Orientation;
        public int TextLineOrder;
        public int WritingDirection;
        public bool IsSubscript;
        public bool IsSuperscript;
        public bool IsDropcap;
        public bool IsWordFromDictionary;
        public bool FontIsSmallCaps;
        public bool FontIsSerif;
        public bool FontIsUnderline;
        public bool FontIsItalic;
        public bool FontIsBold;
        public bool FontIsFraktur;
        public bool FontIsFixedPitch;
        public int FontId;
        public int FontPointSize;
 
        public bool IsBeginOfWord;
        public bool IsBeginOfLine;
        public bool IsBeginOfParagraph;
        public bool IsBeginOfBlock;
 
        public bool IsEndOfWord;
        public bool IsEndOfLine;
        public bool IsEndOfParagraph;
        public bool IsEndOfBlock;
    }
Вопрос: почему она упорно хочет весить 152 байта?! Если сложить все поля - получается 91 байт. StructLayout не помогает, даже если прописать вручную в нём Size = 91, то она просто начинает занимать 148 байт. Я начал думать на Marshal.SizeOf, но нет - если выделить в стеке 2 таких структуры, разница между их адресами будет 152 байта. Однако, разница между указателем на IsEndOfBlock в структуре и указателем на саму структуру - 91 байт.

Я понимаю, что я чего-то не понимаю. Кто-нибудь может прояснить, что здесь происходит?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.06.2021, 10:10
Ответы с готовыми решениями:

Как создать структуру-список, поля которой — ссылка на такую же структуру
Суть вопроса в том, как создать структуру-список, поля которой - ссылка на сл. элемент(такую же структуру) и ссылка на объект, относящийся...

Как создать структуру, где будут поля с указателями на эту же структуру?
#include <stdio.h> #include <stdlib.h> typedef struct DoubleQueue { queue* ar; queue* al; int data; }...

Как правильно написать функцию, которая редактирует структуру по полю Name и возвращает новую, исправленную структуру?..
Нужно отредактировать структуру по выбору пользователя. Проблема заключается в создании функции. Подскажите, а лучше покажите, как...

4
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18297 / 14221 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
20.06.2021, 10:42
Лучший ответ Сообщение было отмечено VBDUnit как решение

Решение

VBDUnit, тип bool по умолчанию маршалируется как 4 байтовое значение. Добавьте к bool полям атрибут
C#
1
[MarshalAs(UnmanagedType.I1)]
и вы получите 91 байт.

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct RecognitedData
{
    public SimpleRect BoundingBox;
    public SimpleRect BaseLine;
    public double DeskewAngle;
    public double ConfidencePercent;
    public int BlockType;
    public int Orientation;
    public int TextLineOrder;
    public int WritingDirection;
    [MarshalAs(UnmanagedType.I1)] public bool IsSubscript;
    [MarshalAs(UnmanagedType.I1)] public bool IsSuperscript;
    [MarshalAs(UnmanagedType.I1)] public bool IsDropcap;
    [MarshalAs(UnmanagedType.I1)] public bool IsWordFromDictionary;
    [MarshalAs(UnmanagedType.I1)] public bool FontIsSmallCaps;
    [MarshalAs(UnmanagedType.I1)] public bool FontIsSerif;
    [MarshalAs(UnmanagedType.I1)] public bool FontIsUnderline;
    [MarshalAs(UnmanagedType.I1)] public bool FontIsItalic;
    [MarshalAs(UnmanagedType.I1)] public bool FontIsBold;
    [MarshalAs(UnmanagedType.I1)] public bool FontIsFraktur;
    [MarshalAs(UnmanagedType.I1)] public bool FontIsFixedPitch;
    public int FontId;
    public int FontPointSize;
 
    [MarshalAs(UnmanagedType.I1)] public bool IsBeginOfWord;
    [MarshalAs(UnmanagedType.I1)] public bool IsBeginOfLine;
    [MarshalAs(UnmanagedType.I1)] public bool IsBeginOfParagraph;
    [MarshalAs(UnmanagedType.I1)] public bool IsBeginOfBlock;
 
    [MarshalAs(UnmanagedType.I1)] public bool IsEndOfWord;
    [MarshalAs(UnmanagedType.I1)] public bool IsEndOfLine;
    [MarshalAs(UnmanagedType.I1)] public bool IsEndOfParagraph;
    [MarshalAs(UnmanagedType.I1)] public bool IsEndOfBlock;
}
2
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373
20.06.2021, 10:52  [ТС]
Удивлён: действительно, sizeof(bool) == 1, но Marshal.SizeOf<bool>() == 4. Большое спасибо!
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18297 / 14221 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
20.06.2021, 10:59
Цитата Сообщение от VBDUnit Посмотреть сообщение
но Marshal.SizeOf<bool>() == 4
Угу. Я тоже не сразу сообразил в чем тут дело. LINQPad выручил
C#
1
2
3
    typeof(RecognitedData).GetFields()
        .Select(f => new { f.Name, f.FieldType, Size = Marshal.SizeOf(f.FieldType) })
        .Dump();
Миниатюры
Как скукожить структуру?  
1
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373
20.06.2021, 21:11  [ТС]
LINQPad
Хм, занятная штука
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.06.2021, 21:11
Помогаю со студенческими работами здесь

Рисование треугольника. Определить структуру Points и структуру Triangle.
Помогите: определить структуру Points и структуру Triangle, включающую в себя три точки (объекты структуры Points). Ввести число элементов...

Заполнить структуру B которая содержит структуру A при условии тога что в A уже записано имя
Есть две структуры. struct A{ char name; char last; }; struct B{ char name A list; };

Считать структуру из одного файла, спросить у пользователя информацию и на ее основе вывести структуру в новый файл
Дана структура &quot;Книги&quot;:Автор, название, цена. Спросить у пользователя бюджет и на его основе выдать книги, которые он может купить. Т.е.,...

Ввод данных в структуру через указатель на структуру
#include &quot;stdafx.h&quot; #include &quot;ctime&quot; #include &quot;iostream&quot; #pragma warning(disable : 4996) using namespace std; class...

Как сделать структуру (как в таблице) выводимых в консоле данных?
Вот этой проге? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;stdlib.h&gt; #include &lt;Windows.h&gt; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru