سؤال

لدي شيء من هذا القبيل

register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}

ماذا تفعل ، لا يهم. يتم تشغيل الكود بسرعة بالطريقة التي أصبحت الآن ، أبطأ إذا تمت إزالة الكلمة الرئيسية للتسجيل. ومع ذلك ، عندما أضيف في السجل قبل int n ، يتم تشغيله في الواقع أبطأ من الآن ، ولكن أسرع مما لو لم يتم استخدام سجلات.

هل يمكن لأحد أن يشرح هذا لي؟ شكرًا.

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

المحلول

register يعطي المترجم تلميحًا لوضع المتغير في سجل بدلاً من مساحة الذاكرة/المكدس. في بعض الحالات ، لن يكون هناك ما يكفي من السجلات لكل متغير تضع هذه الكلمة الرئيسية على وضعها على العديد من المتغيرات يمكن أن يفرض بعضًا من السجلات الأخرى.

هذا مجرد تلميح ، على الرغم من ذلك ، ولا يتعين على المترجم أن يأخذها.

نصائح أخرى

كيف وقتك هذا؟ في التمرين، register عادة لا يفعل شيئا. إنها قطعة من Cruft من عندما كانت تقنية البرمجيات بدائية للغاية ولم يتمكن المترجمون من اكتشاف تخصيص التسجيل بأنفسهم. كان من المفترض أن يكون تلميحًا لتخصيص سجل لهذا المتغير وكان مفيدًا للمتغيرات المستخدمة بشكل متكرر. في الوقت الحاضر ، يتجاهل معظم المجمعين ببساطة ويخصص السجلات وفقًا لخوارزمياتهم الخاصة.

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

unsigned int array[10];

int n;

#define REG register

int main()
{
    REG unsigned int a, b, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

تحصل عليها (اعتمادًا على ما إذا كان Reg محدد أو فارغًا)

diff http://picasaweb.google.com/lh/photo/v2hbpl6d-soidbxuomaw؟feat=directLink

يظهر على اليسار نتيجة استخدام السجلات.

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

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

unsigned int array[10];    

int main()
{
    register int n;
    unsigned int a = 1, b = 2, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

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

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

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

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