.NET'te karmaşık bir nesnenin toplam boyutunu belirlemenin yolları var mı? Bu nesne diğer nesnelerden oluşur ve diğer karmaşık nesnelere referanslar içerebilir. Bu nesne tarafından kapsanan nesnelerden bazıları POD olabilir, diğerleri olmayabilir.
.NET'te karmaşık bir nesnenin toplam boyutunu belirlemenin yolları var mı? Bu nesne diğer nesnelerden oluşur ve diğer karmaşık nesnelere referanslar içerebilir. Bu nesne tarafından kapsanan nesnelerden bazıları POD olabilir, diğerleri olmayabilir.
Sahip olduğunuz şey bir "karmaşık nesne" değil, bir nesne grafiğidir. Toplam boyutunu belirlemek için, bu grafikte yürümeniz gerekir - bazı kök nesnelerden başlayarak ve referans türlerinin alanlarını numaralandırmak ve değerlerini almak için Yansıma'yı kullanmak (ve elbette döngüleri kontrol etmek).
Belirli bir nesnenin boyutunu grafikte görmek için, bkz. ilgili bir soruya bu cevapama bunun tamamen başarısız bir kötülük olduğuna dikkat edin, tamamen desteklenmez, kırılabilir (ve zaten kırılabilir) ve göksel alanlarda bir toptan yavru soykırımıyla sonuçlanabilir. Yani, kesin bir değer elde etmek için “habersiz” bir yol yoktur, çünkü tanım gereği bir uygulama detayıdır - bunun için herhangi bir kullanımınız olmamalıdır. Ve hata ayıklama / profil oluşturma sırasında bir uygulamanın bellek kullanımını bulmak amacıyla, kesmek yeterince iyidir.
Basitçe söylemek gerekirse, bilmenin bir yolu yoktur. Tüm nesnelerin serileştirilebileceğini varsayarak, bunları bir binary bloğa serileştirmek için BinaryFormatter'i kullanabilir ve sonra bunun boyutunu okuyabilirsiniz. Bununla birlikte, bu bazı meta verileri içerecek ve gerçek nesne boyutunu şişirecektir (ancak makul bir tahmin olacaktır).
Değer türleri için Marshal.SizeOf()
Sadece herhangi bir alt nesneyi dikkate almaz. İşaretçinin boyutu olarak herhangi bir iç referans türünü hesaplar.
Yansıma başka bir yoldur, ancak herhangi bir özel üyeyi hafızaya aldırmaz. Yani, yanılmadıkça, bunu gerçekten doğru şekilde yapmanın bir yolu yoktur.
Zor ...
İki nesne aynı dize değişkenine işaret ediyorsa. Dize hangisinin "sahibi"? Bana öyle geliyor ki gerçek bir cevap almak için bir çöp koleksiyonunu simüle etmeniz gerekiyor. Tam olarak hafif değil.
vermek System.Runtime.InteropServices.Marshal.SizeOf()
Bir atış.
StackOverflow'ta başka bir yerde daha önce yanıtladı:
C # cinsinden nesne örneğinin boyutunu bulun
Güvenli olmayan kodu tanıtmanız gerekir (bunun için gerekli işaretçi işlemleri nedeniyle) - kod şuna benzer:
static unsafe int CalcSize(object obj)
{
RuntimeTypeHandle th = obj.GetType().TypeHandle;
int size = *(*(int**)&th + 1);
return size;
}
Ayrıca proje ayarlarını (Project-> Build sekmesi) "Güvenli olmayan kodlara izin ver" olarak işaretlemeyi de unutmayın.