[.net] معرفة حجم كائن



Answers

يرجى اتباع هذه الخطوات للحصول على حجم الكائن.

1) انتقل إلى Visual Studio (2010) Project Properties -> Debug tab -> Enableaged managed debugging.

2) انتقل إلى القائمة تصحيح Visual Studio -> الخيار والإعدادات -> التصحيح -> الرموز.

3) هناك تمكين Microsoft Symbol Server ، ترك الافتراضي. (قد يبدأ تنزيل الرموز)

4) ضبط نقطة الانهيار في التعليمات البرمجية الخاصة بك ، بدء التصحيح (F5).

5) فتح تصحيح -> ويندوز -> نافذة فورية.

6) أدخل .load sos.dll (ابن سترايك)

7) أدخل! DumpHeap -type MyClass (الكائن الذي تريد البحث عن الحجم)

8) من خارج وضع تحديد عنوان الكائن أي (00a8197c)

العنوان MT Size 00a8197c 00955124 36

9) بعد ذلك ،! ObjSize 00a8197c

10) هناك تذهب -> sizeof (00a8197c) = 12 (0x48) بايت (MyClass)

Question

أحاول معرفة مقدار الذاكرة التي تأخذها الكائنات الخاصة بي لمعرفة عدد منها ينتهي في "كائن كائن كبير" (أي شيء أكثر من 85،000 بايت).

هل هي بسيطة مثل إضافة 4 إلى int ، 8 لمدة طويلة ، 4 (أو 8 إذا كنت على 64 بت) لأي أنواع مرجعية إلخ لكل كائن ، أو توجد نفقات عامة للطرق والخصائص الخ.




إذا استطعت - تسلسلها!

Dim myObjectSize As Long

Dim ms As New IO.MemoryStream
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
bf.Serialize(ms, myObject)
myObjectSize = ms.Position



ما لم يكن هذا نوعًا كبيرًا أو نوع مثيل (أي عدة آلاف من الحقول) ، فإن الأنواع الوحيدة التي تحتاج إلى القلق بشأنها هي صفائف كبيرة أو سلاسل. بالطبع ، لمعرفة حجم صفيف ، تحتاج إلى معرفة حجم العنصر.

يقوم .NET (حاليًا) بمحاذاة الأنواع بنفس الطريقة التي يقوم محاذاة المجمعين الأصليين بمحاذاة الأنواع. تحتوي الأنواع الأساسية على محاذاة طبيعية تكون عادةً القوة المتكاملة المستديرة لاثنين من الأقرب إلى حجمها:

Single, Int32, UInt32 - 4
IntPtr, UIntPtr, pointers, references  - 4 on 32-bit, 8 on 64-bit
Double, Int64, UInt64 - 8
Char, Int16, UInt16   - 2
Byte, SByte           - 1

عند تجميع نوع ما ، سيعمل المحول البرمجي على التأكد من أن جميع الحقول من أي نوع معين قد تم إزاحة بدايتها في النسخة المطابقة للحد الذي يتطابق مع هذا النوع - على افتراض عدم استخدام التخطيط الصريح.

تحتوي الأنواع المعرفة بواسطة المستخدم على محاذاة ، والتي يتم حسابها على أنها أعلى محاذاة لأي نوع من أنواع الحقول الخاصة بها. يتم توسيع حجم الكتابة إذا لزم الأمر لجعل حجم النوع محاذاً أيضًا.

ولكن بطبيعة الحال ، لا تزال جميع أنواع المراجع هي فقط IntPtr.Size بالحجم والمحاذاة ، وبالتالي لن يؤثر حجم نوع المرجع على المصفوفات من هذا النوع.

لاحظ أن CLR قد تختار ، وفقًا لتقديرها ، أنواع التخطيط بشكل مختلف عما هو موصوف أعلاه ، ربما لزيادة موضع ذاكرة التخزين المؤقت أو تقليل المساحة التي تتطلبها المحاذاة.




Links