Есть ли пути при определении общего размера сложного объекта в.NET? Этот объект состоит из других объектов и мог бы содержать ссылки на другие сложные объекты. Некоторыми объектами, инкапсулировавшими этим объектом, мог бы быть POD, другие не могут.
То, что у вас есть, это не "сложный объект", это граф объектов. Чтобы определить его общий размер, вам нужно пройтись по этому графу - начиная с некоторого корневого объекта и используя Reflection для перечисления полей ссылочных типов и получения их значений (и проверки циклов, конечно).
Чтобы получить размер конкретного объекта в графе, смотрите этот ответ на смежный вопрос, но учтите, что это злой хак, совершенно не поддерживаемый, может сломаться (и, возможно, уже сломался) и привести к массовому геноциду котят в небесных сферах. Тем не менее, не существует "нехакерского" способа получить точное значение, потому что это деталь реализации по определению - у вас не должно быть для нее никакого применения. А для того, чтобы узнать использование памяти приложением при отладке/профилировании, хака вполне достаточно.
Сложно ...
Что делать, если два объекта указывают на одну и ту же строковую переменную. Кому «принадлежит» строка? Мне кажется, вам нужно смоделировать сборку мусора, чтобы получить верный ответ. Не совсем легкий вес.
Дайте System.Runtime.InteropServices.Marshal.SizeOf ()
выстрел.
Проще говоря, узнать невозможно. Предполагая, что все объекты сериализуемы, вы можете использовать BinaryFormatter, чтобы сериализовать их в двоичный большой двоичный объект, а затем прочитать его размер. Однако это будет включать некоторые метаданные и увеличивать фактический размер объекта (но это будет разумная оценка).
Для типов значений вы должны использовать Marshal.SizeOf ()
, только он не принимает во внимание какие-либо подобъекты. Он будет вычислять любой внутренний ссылочный тип как размер указателя на него.
Отражение - это еще один способ, но он не открывает никаких закрытых членов, занимающих память. Так что, если я не ошибаюсь, нет никакого способа сделать это должным образом.
Ранее ответ был в другом месте на 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».