Занимает ли поле память в структуре, если структура ограничена в длине байт?

243
04 января 2020, 01:00

Мне очень важно понять, будет ли размер структуры изменен, если я ее допустим определили ее так:

[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 12324)]
public unsafe struct GammaControl
{
    public Rgb Scale;
    public Rgb Offset;
    public Rgb[] GammaCurve
    {
        get
        {
            Rgb* realDataPtr = GammaCurvePtr;
            Rgb[] arrayResult = new Rgb[1025];
            for (int i = 0; i < 1025; i++)
            {
                arrayResult[i] = *(realDataPtr + i);
            }
            return arrayResult;
        }
    }
    public Rgb* GammaCurvePtr
    {
        get
        {
            fixed (GammaControl* thisPtr = &this)
            {
                return (Rgb*) IntPtr.Add((IntPtr) thisPtr, 24);
            }
        }
    }
}

И не затрутся ли GammaCurvePtr и GammaCurve если я передам указатель на структуру в неуправляемый код, где после Offset определен массив Rgb[1025] в который записываются данные?

Answer 1

И не затрутся ли GammaCurvePtr и GammaCurve если я передам указатель на структуру в неуправляемый код, где после Offset определен массив Rgb[1025] в который записываются данные?

Ответ - не затрутся. По крайней мере потому, что атрибут StructLayoutAttribute, согласно документации, задает взаимное расположение и размер полей (данных) структуры. А ваши GammaCurvePtr и GammaCurve в конечном счете являются методами структуры.

UPD.

Где хранятся методы?

Сами методы структуры хранятся в секции кода сборки, и оттуда они загружаются при первом запуске сборки. Методы являются частью типа, а не экземпляра типа. А память под переменные метода уже выделяется либо на стеке, либо в куче. Они не будут затирать память, выделенную под вашу структуру.

READ ALSO
Сохранить значение элемента Switch С# Xamarin

Сохранить значение элемента Switch С# Xamarin

Задача: сохранить значение элемента Switch при следующих открытиях приложения (если Switch включен однажды, то чтобы оставался включенным и после...

240
Создание web-интерфейса прибора на asp.net

Создание web-интерфейса прибора на asp.net

Есть плата с микроконтроллером, которая подключается к компьютеру по com-порту и передает на него данныеНеобходимо реализовать возможность...

293
Отловить UnauthorizedAccessException при обходе папок

Отловить UnauthorizedAccessException при обходе папок

Я создаю подпрограмму для своей основнойЕё суть заключается в защите (шифровании) некоторых чувствительных данных от основной программы,...

161
Значения по умолчанию в моделях EF

Значения по умолчанию в моделях EF

Создал проект на aspnet mvc

186