لم تتبع المتغيرات المحلية في المنشئات. هل هذا خطأ في جدب؟
سؤال
وأنا حاليا بتشغيل جدب النسخة 6.7.1 على أوبونتو لينكس، والعمل في مشروع C ++.
والمثير للدهشة كنت أحاول تصحيح منشئ ولقد وجدت أن المتغيرات المحلية أعلنت في نطاق منشئ لا يتبع أو لاحظت من قبل جدب. هل هذا الخلل؟
وشكرا لأي معلومات ..
نصائح أخرى
إذا كنت تستخدم الأمثل (-O)، تعطيله (إزالة -O أو استخدام -O0). المترجم أحيانا ذكية جدا والتخمينات متغير أنه لا حاجة، القيام بعمليات حسابية في وقت الترجمة، تغيير نطاق متغير، وأو العديد من الحيل الأخرى.
لاحظ أنه حتى مع "لا الأمثل"، لا تزال تفعل بعض التحسينات تافهة، لكنها يجب أن لا تتدخل كثيرا مع التصحيح. أيضا، مع استخدام مضمنة الثقيلة من C ++ (بما في ذلك STL)، يمكن أن البرنامج أصبح أبطأ بكثير دون الأمثل.
وهذا يبدو وكأنه كنت تصحيح بناء الأمثل.
والمصحح 'يعرف' قيمة المتغيرات المحلية لأن الملف رمز يصف موقعها في وظائف كومة الإطار.
والمصحح ويمكن بعد ذلك قراءة المتغيرات من ذكرى عملية الهدف. ومع ذلك، وهذا يتطلب أن الإطار كومة تحتوي على ما يصل إلى تاريخ نسخ من المتغيرات المحلية. عند ترجمة دون تحسينات الشفرة التي تم إنشاؤها دائما إرسال المتغيرات المحلية مرة أخرى إلى مواقعها إطار مكدس في كل مرة يتم تعديلها. وهذا يجعل التصحيح سهلة، ولكن تكاليف في وقت التشغيل.
للبناء الأمثل المترجم سوف يستنتج كثير من الأحيان أن هذه الخطوات غير الضرورية، والحفاظ على قيمة في سجل وحدة المعالجة المركزية لطالما هناك حاجة إليها. قد يكون جيدا أن متغير محلي لم يحصل على قيمة مكتوبة إلى المكدس على الإطلاق. المصحح في هذه الحالة لا يوجد لديه وسيلة لتتبع قيمة المتغير، ولكن أيضا لا أعرف هذا، وكثيرا ما يقدم تقريرا البيانات من المكدس كما لو كانت قيمة المتغير.