سؤال

حسنا, أنا على علم أن معيار يفرض أن تنفيذ C++ قد تختار في أي ترتيب الحجج من وظيفة يتم تقييمها ، ولكن هل هناك أي تطبيقات في الواقع 'الاستفادة من هذا في السيناريو حيث أنها تؤثر فعلا على البرنامج ؟

المثال الكلاسيكي:

int i = 0;
foo(i++, i++);

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

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

المحلول

ذلك يعتمد على نوع الوسيطة ، دعا وظيفة الدعوة الاتفاقية ، archtecture البرمجي.على x86 ، باسكال واصفا الاتفاقية يقيم الحجج اليسار إلى اليمين بينما في ج الدعوة الاتفاقية (__cdecl) ومن اليمين إلى اليسار.معظم البرامج التي تعمل على منصات متعددة تأخذ بعين الاعتبار الاتفاقيات الدعوة إلى تخطي المفاجآت.

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

تحرير: طالما نحن تقسيم الشعر:جوابي يعامل هذا ليس كلغة السؤال ولكن بوصفها منصة واحدة.اللغة القياسية لا ضمانة أو تفضل واحدة على الأخرى ويترك على أنها غير محدد.ملاحظة الصياغة.فإنه لا يقول هذا غير معروف.غير محدد في هذا المعنى يعني شيء لا يمكنك الاعتماد على غير المحمولة السلوك.ليس لدي ج المواصفات/مشروع مفيد ولكن يجب أن تكون مماثلة لتلك التي من n2798 مشروع (C++)

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

نصائح أخرى

ولقد وجدت الإجابة في ج ++ معايير .

والفقرة 5.2.2.8:

<اقتباس فقرة>   

وترتيب تقييم الحجج غير محدد. جميع الآثار الجانبية للتقييم التعبير حجة نافذة المفعول قبل إدخال الدالة. ترتيب تقييم التعبير لواحق والقائمة التعبير الحجة   غير محددة.

وبعبارة أخرى، فإنه يعتمد على مترجم فقط.

كل الحجج التي يتم تقييمها.لكي لا يعرف (كما في المعيار).ولكن جميع تطبيقات C/C++ (علمي) تقييم الحجج وظيفة من من اليمين إلى اليسار. تحرير:رنة هو استثناء (انظر التعليق أدناه).

وأعتقد أن من اليمين إلى اليسار تقييم النظام جدا جدا قديم (منذ أول ج المجمعين).بالتأكيد قبل أن C++ اخترع معظم تطبيقات C++ سيتم الحفاظ على نفس ترتيب تقييم لأن وقت مبكر C++ تطبيقات ببساطة ترجمتها إلى C.

هناك بعض أسباب فنية لتقييم الحجج وظيفة من اليمين إلى اليسار.في كومة أبنية ، الحجج عادة دفع إلى المكدس.في C/C++, يمكنك استدعاء الدالة مع المزيد من الحجج من الواقع المحدد -- اضافية الحجج simiply تجاهلها.إن الحجج التي يتم تقييمها من اليسار إلى اليمين ، ودفعت من اليسار إلى اليمين ، ثم المكدس فتحة تحت مؤشر مكدس عقد آخر حجة ، وليس هناك طريقة للحصول على وظيفة للحصول على تعويض من أي الحجة (لأن العدد الفعلي من الحجج التي دفعت يعتمد على المتصل).

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

الآن, من اليمين إلى اليسار دفع النظام لا ولاية اليمين إلى اليسار تقييم النظام, ولكن في وقت مبكر المجمعين ، الذاكرة نادرة.في اليمين إلى اليسار تقييم النظام نفس كومة يمكن استخدامها في مكان (أساسا ، بعد تقييم الحجة-التي قد تكون تعبير أو funciton الدعوة!- عودة قيمة هو بالفعل في المكان المناسب على المكدس).في اليسار إلى اليمين التقييم الحجة القيم يجب أن يتم تخزينها بشكل منفصل و دفع إلى المكدس في ترتيب عكسي.

وآخر مرة رأيت الخلافات كان بين VS2005 و 3.x دول مجلس التعاون الخليجي على أجهزة x86 في عام 2007. لذلك فمن (كان؟) حالة من المرجح جدا. لذلك أنا لا تعتمد على ترتيب التقييم بعد الآن. ربما من الأفضل الآن.

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

scroll top