سؤال

أثناء القراءة عن الوظيفة زيادة متشابكة لقد رأيت ملاحظة مفادها أن المتغير الذي تم تمريره يجب أن يكون محاذيًا لحدود 32 بت.عادةً ما رأيت الكود الذي يستخدم InterlockedIncrement مثل هذا:

class A
{
 public:
   A();
   void f();

 private:
  volatile long m_count;
};

A::A() : m_count(0)
{
}

void A::f()
{
  ::InterlockedIncrement(&m_count);
}

هل يعمل الكود أعلاه بشكل صحيح في الأنظمة متعددة المعالجات أم يجب أن أهتم أكثر بهذا الأمر؟

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

المحلول

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

كما يمكن استخدام التوجيه "#pragma pack" لتغيير المحاذاة داخل وحدة الترجمة.

أود أن أضيف أن الإجابة تفترض وجود مترجم Microsoft C/C++.قد تختلف قواعد التعبئة من مترجم إلى آخر.ولكن بشكل عام، أود أن يفترض أن معظم برامج التحويل البرمجي C/C++ لنظام التشغيل Windows تستخدم نفس إعدادات التعبئة الافتراضية فقط لتسهيل العمل مع رؤوس Microsoft SDK قليلاً.

نصائح أخرى

والرمز تبدو على ما يرام (المتغيرات سوف تكون محاذاة بشكل صحيح ما لم تفعله على وجه التحديد شيء لكسر ذلك - وعادة ما تنطوي الصب أو هياكل 'معبأة').

نعم، هذا سوف تعمل بشكل جيد. المجمعين عادة لا محاذاة ما لم يتقرر غير ذلك.

وبالمعنى الدقيق للكلمة، انها حقا يتوقف على استخدامك للA - على سبيل المثال، إذا كنت حزمة من "A" الكائن ضمن قذيفة ITEMIDLIST، أو البنية مع سيئة "حزمة PRAGMA" البيانات قد لا تكون محاذاة بشكل صحيح

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