سؤال

أنا أنظر إلى هذا النص في توثيق من أجل Visual C ++ 'S _readwriteBarrier internsic:

في الإصدارات السابقة من برنامج التحويل البرمجي C ++ المرئي ، تم فرض وظائف _readwriteBarrier و _writeBarrier محليًا فقط ولم تؤثر على الوظائف لأعلى شجرة الاتصال. في Visual C ++ 2005 وبعد ذلك ، يتم تطبيق هذه الوظائف على طول الطريق لأعلى شجرة الاتصال.

أفهم ما يفعله الحاجز ضمن وظيفة ما ، ولكن يبدو أن "شجرة الاتصال" تعني أن الوظيفة foo() استدعاء وظيفة bar() يمكن أن تعرف ما إذا كان bar() يحتوي على حاجز أم لا. ما الذي تغير بالفعل في VC2005 لتمكين هذا ... اتفاقية الاتصال/ABI ، بعض التحليلات العالمية التي أجراها المترجم ، أو ماذا؟

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

المحلول

مستندات MS ليست رائعة أبدًا ، وهذا مثال جيد على ذلك. هناك جزأين لـ _readwriteBarrier:

  1. إخبار وحدة المعالجة المركزية بالقيام بحاجز الذاكرة (أي mfence) ،
  2. إخبار المترجم بعدم التحسين حول الحاجز.

أظن أن جزء شجرة الاتصال يشير إلى رقم 2. بمعنى آخر:

int x = 0;

void foo()
{
   x = 7;
   _ReadWriteBarrier();
   x = 8;
}

بدون الحاجز ، يمكن إزالة x = 7 بالكامل بواسطة التحويل البرمجي. مع الحاجز ، يبقى. الآن ، ماذا عن وظيفة ذلك المكالمات فو؟

void bar()
{
   x = 3;  // optimized away?
   foo();
   x = 4;
}

أعتقد أنه في الماضي X = 3 ربما تم تحسينه بعيدًا (والذي قد يكون من الصعب على المترجم معرفة ما إذا كان هذا مسموحًا أم لا) ، ولكن الآن سيحتفظ بشكل صحيح بتعليمات X = 3.

أظن.

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