سؤال
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.