سؤال

ما هو تخطيط الذاكرة لمجموعة .NET؟

خذ على سبيل المثال هذه المصفوفة:

Int32[] x = new Int32[10];

أفهم أن الجزء الأكبر من المصفوفة يشبه هذا:

0000111122223333444455556666777788889999

حيث يكون كل حرف بايت واحد، والأرقام تتوافق مع المؤشرات الموجودة في المصفوفة.

بالإضافة إلى ذلك، أعلم أن هناك مرجعًا للنوع، وفهرس syncblock لجميع الكائنات، لذلك يمكن تعديل ما ورد أعلاه على النحو التالي:

ttttssss0000111122223333444455556666777788889999
        ^
        +- object reference points here

بالإضافة إلى ذلك، يجب تخزين طول المصفوفة، لذا ربما يكون هذا هو الأصح:

ttttssssllll0000111122223333444455556666777788889999
        ^
        +- object reference points here

هل هذا كامل؟هل هناك المزيد من البيانات في المصفوفة؟

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

لذا، بالنسبة للمصفوفة، ما مقدار الحمل الموجود، هذا هو سؤالي بشكل أساسي.

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

هل كانت مفيدة؟

المحلول

سؤال عظيم.وجدت هذا مقالة تحتوي على مخططات بيانية لكل من أنواع القيم وأنواع المراجع.انظر هذا أيضا شرط حيث يقول ريتشر:

Snip] كل صفيف لديه بعض المعلومات العامة الإضافية المرتبطة به.تحتوي هذه المعلومات على رتبة الصفيف (عدد الأبعاد) ، والحدود السفلية لكل بعد من الصفيف (دائمًا تقريبًا 0) ، وطول كل بعد.يحتوي النفقات العامة أيضًا على نوع كل عنصر في الصفيف.

نصائح أخرى

إحدى الطرق لفحص ذلك هي إلقاء نظرة على التعليمات البرمجية الموجودة في WinDbg.لذا، بالنظر إلى الكود أدناه، فلنرى كيف يظهر ذلك في الكومة.

var numbers = new Int32[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

أول شيء يجب فعله هو تحديد موقع المثيل.كما جعلت هذا محليًا في Main(), ، فمن السهل العثور على عنوان المثيل.

من العنوان يمكننا تفريغ المثيل الفعلي، والذي يعطينا:

0:000> !do 0x0141ffc0
Name: System.Int32[]
MethodTable: 01309584
EEClass: 01309510
Size: 52(0x34) bytes
Array: Rank 1, Number of elements 10, Type Int32
Element Type: System.Int32
Fields:
None

يخبرنا هذا أن مصفوفتنا Int32 تحتوي على 10 عناصر ويبلغ حجمها الإجمالي 52 بايت.

دعونا نفرغ الذاكرة التي يوجد بها المثيل.

0:000> d 0x0141ffc0
0141ffc0 [84 95 30 01 0a 00 00 00-00 00 00 00 01 00 00 00  ..0.............
0141ffd0  02 00 00 00 03 00 00 00-04 00 00 00 05 00 00 00  ................
0141ffe0  06 00 00 00 07 00 00 00-08 00 00 00 09 00 00 00  ................
0141fff0  00 00 00 00]a0 20 40 03-00 00 00 00 00 00 00 00  ..... @.........
01420000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
01420010  10 6d 99 00 00 00 00 00-00 00 01 40 50 f7 3d 03  .m.........@P.=.
01420020  03 00 00 00 08 00 00 00-00 01 00 00 00 00 00 00  ................
01420030  1c 24 40 03 00 00 00 00-00 00 00 00 00 00 00 00  .$@.............

لقد قمت بإدراج قوسين لـ 52 بايت.

  • البايتات الأربع الأولى هي المرجع إلى جدول الطريقة على الرقم 01309584.
  • ثم أربعة بايت لطول المصفوفة.
  • يلي ذلك الأرقام من 0 إلى 9 (كل منها أربع بايتات).
  • البايتات الأربع الأخيرة فارغة.لست متأكدًا تمامًا، ولكن أعتقد أنه يجب أن يكون هذا هو المكان الذي يتم فيه تخزين المرجع إلى مصفوفة syncblock إذا تم استخدام المثيل للقفل.

يحرر:نسيت الطول في المشاركة الأولى

القائمة غير صحيحة بعض الشيء لأنه كما يشير romkyns فإن المثيل يبدأ فعليًا عند العنوان - 4 والحقل الأول هو Syncblock.

والسؤال الكبير! أردت أن أرى لنفسي، ويبدو فرصة جيدة لمحاولة الخروج CorDbg.exe ...

ويبدو أن للصفائف عدد صحيح بسيطة، والشكل هو:

ssssllll000011112222....nnnn0000

وحيث الصورة هي كتلة المزامنة، ل طول المصفوفة، ثم العناصر الفردية. ويبدو أن هناك أخيرا 0 في النهاية، أنا لست متأكدا من السبب في هذا هو.

لالمصفوفات متعددة الأبعاد:

ssssttttl1l1l2l2????????
    000011112222....nnnn000011112222....nnnn....000011112222....nnnn0000

وحيث أن كتلة متزامنة، ر عدد من العناصر، L1 الصورة طول البعد الأول، L2 طول البعد الثاني، ثم اثنين أصفار ؟، تليها كل العناصر بالتسلسل، وأخيرا الصفر مرة أخرى .

يتم التعامل مع

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top