Как определить размер экземпляра? - PullRequest
0 голосов
/ 03 октября 2011

Я настроил свой проект на прием небезопасного кода и имею следующий вспомогательный класс для определения размера экземпляра:

struct MyStruct
    {
        public long a;
        public long b;
    }

public static class CloneHelper
    {
        public unsafe static void GetSize(BookSetViewModel book)
        {
            long n = 0;

            MyStruct inst;
            inst.a = 0;
            inst.b = 0;
            n = Marshal.SizeOf(inst);
        }
}

Это прекрасно работает со структурой.Однако, как только я использую фактический экземпляр класса, который передается в:

public unsafe static void GetSize(BookSetViewModel book)
        {
            long n = 0;


            n = Marshal.SizeOf(book);
        }

, я получаю эту ошибку:

Тип 'BookSetViewModel' не может маршалироваться как неуправляемая структура;невозможно вычислить значимый размер или смещение.

Есть идеи, как мне это исправить?Спасибо,

1 Ответ

3 голосов
/ 03 октября 2011

Ну, это действительно зависит от того, что вы подразумеваете под «размером» экземпляра. В памяти есть размер одного объекта, но вам обычно нужно подумать о любых объектах, на которые ссылается корневой объект. Вот сколько памяти может восстановить после того, как корень получит право на сборку мусора ... но вы не можете просто добавить их, так как на эти объекты может ссылаться несколько других объекты, и действительно, могут быть повторяющиеся ссылки даже внутри одного объекта.

В этом блоге показан некоторый код, который я использовал ранее для определения размера необработанных объектов (заголовок + поля), без учета каких-либо дополнительных затрат из-за объектов, на которые ссылается один объект. Это не то, что я бы использовал в производственном коде, но это полезно для экспериментов с тем, насколько велик объект в различных условиях.

...