Войти
ПрограммированиеФорумОбщее

[.Net Core, C#] Как можно узнать размер объекта?

#0
(Правка: 23:10) 23:08, 16 апр. 2018

Приветствую
У CryEngine есть удобная фишка - он при профилировании, например командой MemStats 2000, может показать сколько памяти занимают модули и основные под-системы, например - https://i.imgur.com/raaZ5KO.jpg
Вопрос, как можно подобное реализовать на шарпе для непосредственно шарповых классов (а не допустим тех что "проносишь" из C через Marshal) ?

P.S. Да, всякие утилиты типа dotMemory никто не отменял, но это не удобно. В игре - гораздо сподручнее наблюдать подобную информацию в режиме real-time не отвлекаясь особо от блуждания по игровому миру например.


#1
6:53, 17 апр. 2018

Сериализовать BinaryFormatterом, и посмотреть размер массива.

#2
(Правка: 8:10) 8:10, 17 апр. 2018

Marshal.SizeOf

public class MyClass {

  public int GetSize() {
    return Marshal.SizeOf(typeof(this));
  }

}
#3
(Правка: 11:33) 11:31, 17 апр. 2018

cherepets
А без сериализации никак? Допустим класс игровой консоли нет смысла сериализовывать, как и многие другие :)
А у сериализации есть какие-либо накладные расходы? Или в принципе можно сериализовать любой маломальски значимый класс просто так?

monobogdan
Спасибо, гляну

#4
(Правка: 12:02) 12:02, 17 апр. 2018

monobogdan
Не компилируется: https://i.imgur.com/KBmJp38.png
Хотя выглядело так просто и красиво...

#5
(Правка: 16:17) 16:15, 17 апр. 2018

Кинжал
this.GetType()

this можно опустить

#6
5:25, 19 апр. 2018

Кинжал
Есть некоторые накладные расходы, но в целом это лучший способ что я знаю.
Так же не уверен что Marshal с объектами из управляемого кода хорошо дружит.

#7
(Правка: 22:14) 22:00, 23 апр. 2018

Skyblade
monobogdan
Спасибо за помощь, но вот только не очень понимаю к чему тут Marshal? Ибо я только с управляемым кодом работаю, поэтому Marshal мне тут не поможет :-\ За исключением unsafe'а, но unsafe только ради этой фичи тоже всюду не пихнёшь..
И видимо остаётся только сериализация...

ПрограммированиеФорумОбщее