سؤال

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

void func()
{
    char c;
    int i;
    short s;
    ...
}

ونحن سوف إعادة ترتيب هذا:

void func()
{
    int i;
    short s;
    char c;
    ...
}

لأن المحاذاة القضايا الأولى أسفرت عن 12 بايت من مساحة مكدس المستخدمة والثاني تسفر سوى عن 8 بايت.

هل هذا معيار السلوك ج المجمعين أو مجرد عيب مترجم كنا تستخدمه ؟

يبدو لي أن المترجم ينبغي أن تكون قادرة على إعادة ترتيب كومة المتغيرات لصالح أصغر حجم الملف القابل للتنفيذ إذا أرادت.فقد قيل لي أن بعض جوانب C القياسية يمنع هذا, لكني لم أكن قادرة على العثور على مصدر موثوق في كلتا الحالتين.

كمكافأة السؤال ، هل هذا ينطبق أيضا على C++ compilers ؟

تحرير

إذا كان الجواب نعم, C/C++ compilers يمكن إعادة ترتيب كومة المتغيرات ، يمكن إعطاء مثال عن مترجم بالتأكيد يفعل هذا ؟ أود أن أرى مترجم وثائق أو شيئا من هذا القبيل التي تدعم هذا الأمر.

تحرير مرة أخرى

شكرا للجميع على مساعدتكم.للتوثيق أفضل شيء لقد كنت قادرا على العثور على ورقة الأمثل كومة فتحة المهمة في دول مجلس التعاون الخليجي(pdf) ، نافين شارما و سانجيف كومار غوبتا ، التي قدمت في قمة دول مجلس التعاون الخليجي إجراءات في عام 2003.

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

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

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

المحلول

كما لا يوجد شيء في مستوى يحظر ذلك على C أو C++ compilers, نعم, مترجم يمكن أن نفعل ذلك.

الأمر مختلف بالنسبة المجاميع (أيالبنيات) ، حيث النظام النسبي يجب الحفاظ عليها ، ولكن لا يزال المترجم قد أدخل لوحة بايت لتحقيق الأفضل المحاذاة.

IIRC أحدث MSVC المجمعين استخدام هذه الحرية في قتالهم ضد تجاوزات المخزن المؤقت من السكان المحليين.

كملاحظة جانبية, in C++, ترتيب التدمير يجب أن يكون عكس ترتيب الإعلان ، حتى لو كان مترجم reorders تخطيط الذاكرة.

(لا أستطيع اقتباس الفصل الآية ، على الرغم من هذا من الذاكرة.)

نصائح أخرى

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

كومة تحتاج تكن حتى موجودة (في الواقع ، C99 لا يكون معيار واحد قوع كلمة "كومة").لذا نعم, المترجم هو حر في أن يفعل ما يريد طالما أنه يحافظ على دلالات المتغيرات مع التخزين التلقائي مدة.

كما على سبيل المثال:واجهت مرات عديدة في حالة حيث لا يمكن عرض متغير محلي في المصحح لأنه تم تخزينها في التسجيل.

المترجم هو حتى مجانا لإزالة متغير من المكدس وجعلها التسجيل إلا إذا كان التحليل يظهر أن عنوان المتغير هو لم تؤخذ/المستخدمة.

مترجم قد لا يكون باستخدام مكدس في جميع البيانات.إذا كنت على منصة صغيرة بحيث أنت قلق 8 مقابل 12 بايت من المكدس ، فمن المحتمل أن تكون هناك المجمعين الذي جميلة المتخصصة النهج.(بعض الموافقة المسبقة عن علم 8051 المجمعين تتبادر إلى الذهن)

ما المعالج هل تجميع ؟

مترجم عن Texas instruments 62xx سلسلة من DSP هو قادر عليه, ولا "البرنامج كله الأمثل." ( يمكنك إيقاف تشغيله)

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

C و C++ لا فعلا وعد نموذج الذاكرة (في معنى قول JVM) ، لذا فإن الأمور يمكن أن تكون مختلفة تماما و لا تزال قانونية.

بالنسبة لأولئك الذين لا يعرفون لهم ، 62xx الأسرة 8 تعليمات لكل ساعة دورة DSP ، في 750Mhz ، يفعلون الذروة في 6e+9 التعليمات.بعض الوقت على أي حال.يفعلون التنفيذ المتوازي ، ولكن التعليمات يأمر هو به في المجمع ، وليس وحدة المعالجة المركزية ، مثل Intel x86.

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

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

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

بقدر ما أعرف, لا يوجد شيء أن يقول المتغيرات تحتاج إلى أن توضع في أي موقع معين أو المحاذاة على كومة ل C/C++;المترجم وضعها أينما أفضل أداء و/أو كل ما هو مناسب من أجل مترجم الكتاب.

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

ليس هناك حاجة تكهنات حول ما ج القياسية يتطلب أو لا تتطلب:الأخيرة المسودات هي متاحة بحرية على شبكة الإنترنت من ANSI/ISO الفريق العامل.

هذا لا يجيب على سؤالك ولكن هنا هو بلدي 2 سنت عن مسألة ذات صلة...

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

#pragma pack(push, 16)

typedef struct _S_speedy_struct{

 double fval[4];
 int64  lval[4];
 int32  ival[8];

}S_speedy_struct;

#pragma pack(pop)

int function(...)
{
  int i, t, rv;
  S_speedy_struct *ptr;
  char buff[112]; // sizeof(struct) + alignment

  // ugly , I know , but it works...
  t = (int)buff;
  t +=  15; // alignment - 1
  t &= -16; // alignment
  ptr = (S_speedy_struct *)t;

  // speedy code goes on...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top