Способы определить размер сложного объекта в.NET?

Есть ли пути при определении общего размера сложного объекта в.NET? Этот объект состоит из других объектов и мог бы содержать ссылки на другие сложные объекты. Некоторыми объектами, инкапсулировавшими этим объектом, мог бы быть POD, другие не могут.

17
задан Polaris878 16 June 2010 в 21:07
поделиться

5 ответов

То, что у вас есть, это не "сложный объект", это граф объектов. Чтобы определить его общий размер, вам нужно пройтись по этому графу - начиная с некоторого корневого объекта и используя Reflection для перечисления полей ссылочных типов и получения их значений (и проверки циклов, конечно).

Чтобы получить размер конкретного объекта в графе, смотрите этот ответ на смежный вопрос, но учтите, что это злой хак, совершенно не поддерживаемый, может сломаться (и, возможно, уже сломался) и привести к массовому геноциду котят в небесных сферах. Тем не менее, не существует "нехакерского" способа получить точное значение, потому что это деталь реализации по определению - у вас не должно быть для нее никакого применения. А для того, чтобы узнать использование памяти приложением при отладке/профилировании, хака вполне достаточно.

10
ответ дан 30 November 2019 в 14:00
поделиться

Сложно ...

Что делать, если два объекта указывают на одну и ту же строковую переменную. Кому «принадлежит» строка? Мне кажется, вам нужно смоделировать сборку мусора, чтобы получить верный ответ. Не совсем легкий вес.

2
ответ дан 30 November 2019 в 14:00
поделиться

Дайте System.Runtime.InteropServices.Marshal.SizeOf () выстрел.

1
ответ дан 30 November 2019 в 14:00
поделиться

Проще говоря, узнать невозможно. Предполагая, что все объекты сериализуемы, вы можете использовать BinaryFormatter, чтобы сериализовать их в двоичный большой двоичный объект, а затем прочитать его размер. Однако это будет включать некоторые метаданные и увеличивать фактический размер объекта (но это будет разумная оценка).

Для типов значений вы должны использовать Marshal.SizeOf () , только он не принимает во внимание какие-либо подобъекты. Он будет вычислять любой внутренний ссылочный тип как размер указателя на него.

Отражение - это еще один способ, но он не открывает никаких закрытых членов, занимающих память. Так что, если я не ошибаюсь, нет никакого способа сделать это должным образом.

4
ответ дан 30 November 2019 в 14:00
поделиться

Ранее ответ был в другом месте на StackOverflow:

Найти размер экземпляра объекта в байтах в C #

Вам необходимо ввести небезопасный код (из-за операций с указателем, необходимых для этого) - код выглядит следующим образом:

static unsafe int CalcSize(object obj)
{
    RuntimeTypeHandle th = obj.GetType().TypeHandle;
    int size = *(*(int**)&th + 1);
    return size;
}

Также не забудьте отметить в настройках проекта (Project-> Build tab) значение «Allow unsafe code».

1
ответ дан 30 November 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: