سؤال

أود أن أعرف كيف يعمل .maxstack حقا. أعلم أنه لا يلزم القيام به بالحجم الفعلي للأنواع التي تعلنها ولكن مع عددهم. أسئلتي هي:

  1. هل هذا ينطبق فقط على الوظيفة، أو إلى جميع الوظائف التي ندعوها؟
  2. حتى لو كان الأمر فقط لهذه الوظيفة، يتم الإعلان عن maxstack، كيف تعرف ما هي Maxstack إذا كان لديك تفرع؟ تذهب ورؤية كل "المسارات" وإرجاع القيمة القصوى الممكنة؟
  3. ماذا يحدث إذا قمت بتعيينه إلى 16 عاما، في الواقع هناك 17 متغيرات؟
  4. هل هناك كبير جدا من العقوبة إذا قمت بتعيينها إلى 256؟
هل كانت مفيدة؟

المحلول

.maxstack هو جزء من التحقق من IL. في الأساس .maxstack يحكي JIT حجم المكدس الأقصى الذي يحتاجه لحفظ الأسلوب. علي سبيل المثال، x = y + (a - b) يترجم إلى

(pseudo il :)

1. Push y on the stack
2. Push a on the stack
3. Push b on the stack
4. Pop the last two items from the stack,
      substract them and
      push the result on the stack
5. Pop the last two items from the stack,
      add them and
      push the result on the stack
6. Store the last item on the stack in x and
      pop the last item from the stack

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

أيضا، لا يمكن أن يكون لديك شيء من هذا القبيل كما يتطلب حجم كومة لا حصر لها:

1. Push x on the stack
2. Jump to step 1

للإجابة على أسئلتكم:

  1. هل هذا ينطبق فقط على الوظيفة، أو إلى جميع الوظائف التي ندعوها؟

فقط لهذه الوظيفة

  1. حتى لو كان الأمر فقط لهذه الوظيفة، يتم الإعلان عن maxstack، كيف تعرف ما هي Maxstack إذا كان لديك تفرع؟ تذهب ورؤية كل "المسارات" وإرجاع القيمة القصوى الممكنة؟

تذهب ورؤية جميع المسارات وإرجاع القيمة القصوى الممكنة

  1. ماذا يحدث إذا قمت بتعيينه إلى 16 عاما، في الواقع هناك 17 متغيرات؟

لا علاقة له بعدد المتغيرات، انظر Lasse V. Karlsen.إجابة

  1. هل هناك كبير جدا من العقوبة إذا قمت بتعيينها إلى 256؟

لا يبدو وكأنه فكرة جيدة، لكنني لا أعرف.

هل لديك حقا لحساب .maxstack نفسك؟ System.Reflection.Emit يحسب ذلك من أجلك IIRC.

نصائح أخرى

لا علاقة له رقم من المتغيرات المعلنة، ولكن بدلا من ذلك أن تفعل كل شيء مع عدد القيم التي تحتاجها لدفعها على كومة في أي وقت معين من أجل حساب بعض التعبير.

على سبيل المثال، في التعبير التالي، أود أن أفترض أن قيم 2 يجب دفعها إلى المكدس:

x = y + z;

لا يرتبط هذا بحقيقة أن هناك ما لا يقل عن 3 متغيرات موجودة، x، y، و z، وربما الآخرين كذلك.

لسوء الحظ، لا أعرف الإجابة على أسئلتك الأخرى، وأود أن تخمين التجربة ستكون طريقة واحدة للعثور على بعض الإجابات.

يمكنك الرجوع إلى ما يلي ومعيار ECMA للحصول على فهم أفضل:

void  msd(string a,
  string b,
  string c,
  string d,
  string e)
  {
  Console.WriteLine(a);
}

msd("a","b","c","d","e");

عندما أركض ildasm.exe حصلت على هذا:

{
  .entrypoint
  // Code size       40 (0x28)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  nop
  IL_0002:  ldstr      "a"
  IL_0007:  ldstr      "b"
  IL_000c:  ldstr      "c"
  IL_0011:  ldstr      "d"
  IL_0016:  ldstr      "e"
  IL_001b:  call       void sf.Program::'<Main>g__msd|0_0'(string,
                                                           string,
                                                           string,
                                                           string,
                                                           string)
  IL_0020:  nop
  IL_0021:  call       string [mscorlib]System.Console::ReadLine()
  IL_0026:  pop
  IL_0027:  ret
} // end of method Program::Main

من أعلى. لقد وجدت ماكس stakc القيمة التي لا تحددها تعليمات الدفع والبوب.

لم أكن أعرف ما هي قيم عدد المكدس الحقيقي. لذلك، أشير ildasm شفرة فك التشفير لتحديد قيمة مكدس أقصى حقيقي.

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