سؤال

void function(int a, int b, int c) {
   char buffer1[5];
   char buffer2[10];
}

يجب أن نتذكر أنه لا يمكن معالجة الذاكرة إلا بمضاعفات حجم الكلمة. كلمة في حالتنا هي 4 بايت ، أو 32 بت. لذا فإن المخزن المؤقت 5 بايت الخاص بنا سيستغرق حقًا 8 بايت (كلمتين) من الذاكرة ، وسيستغرق المخزن المؤقت 10 بايت لدينا 12 بايت (3 كلمات) من الذاكرة. لهذا السبب يتم طرح SP بحلول 20.

لماذا ليس السقف ((5+10)/4)*4 = 16؟

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

المحلول

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

يُعرف هذا أيضًا باسم "التعبئة" ويمكن القيام به في C/C ++ مع Pragmas ، ولكنه مفيد فقط في حالات محددة للغاية ويمكن أن يكون خطيرًا للأداء وكسبب لمصائد وقت التشغيل المحتملة. ستقوم بعض المعالجات بإنشاء أخطاء على الوصول غير المحسس في وقت التشغيل ، والتي ستعطل البرنامج.

نصائح أخرى

يتم محاذاة المتغيرات على بنيةك بشكل فردي. يتم تقريب Buffer1 حتى 8 و Buffer2 إلى 12 بحيث يكون كل من عناوين البدء 4 بايت محاذاة. لذلك 8+12 = 20.

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