سؤال

معظم الكود الذي قرأته على الإطلاق يستخدم int لمعالجة الأخطاء القياسية (قيم الإرجاع من الوظائف ومثلها). لكنني أتساءل عما إذا كان هناك أي فائدة من استخدام uint_8 سيقوم برصيد مترجم - قراءة: معظم المترجمين C على معظم الهندسة - الإنتاج تعليمات باستخدام وضع العنوان الفوري - أي ضئلا 1 بايت في التعليمات؟ التعليمات الرئيسية التي أفكر فيها هي قارن بعد وظيفة، باستخدام UINT_8 كوعي عودة، إرجاع.

يمكن أن أفكر في الأشياء بشكل غير صحيح، كما أدخل نوعا 1 بايت يؤدي فقط إلى مشاكل المحاذاة - ربما يكون هناك سبب عاقل تماما يجعل التجمعات ترغب في حزم الأشياء في 4 بايت، وهذا ربما السبب في أن الجميع يستخدمون الجميع فقط نظرا لأن هذا هو قضية متعلقة بمكدس بدلا من كومة الكومة لا توجد علامات عامة.

فعل الشيء الصحيح هو ما أفكر فيه. ولكن دعونا نقول القول من أجل الحجة هذا هو المعالج الدقيق الرخيص الشهير لساعة ذكية وأنه تم تكوينها مع 1K من الذاكرة ولكن لديها أوضاع معالجة مختلفة في مجموعة التعليمات الخاصة بها: D

سؤال آخر متخصص قليلا في المناقشة (X86) سيكون: هو الحرفي في:

uint_32 x=func(); x==1;

و

uint_8 x=func(); x==1;

نفس النوع؟ أو هل سيولد المحول البرمجي حرفيا 8 بايت في الحالة الثانية. إذا كان الأمر كذلك، فقد يستخدمه لتوليد تعليمات مقارنة التي تحتوي على حرفي كقيمة فورية وعاد إرجاعها كمرجع تسجيل. انظر أنواع التعليمات CMP..

إرشاد آخر لمجموعة تعليمات X86.

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

المحلول

إليك ما سيفعله مترجم واحد معين من أجل التعليمات البرمجية التالية:

extern int foo(void) ;
void bar(void)
{
        if(foo() == 31) { //error code 31
                do_something();
        } else {
                do_somehing_else();
        }
}

   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 08                sub    $0x8,%esp
   6:   e8 fc ff ff ff          call   7 <bar+0x7>
   b:   83 f8 1f                cmp    $0x1f,%eax
   e:   74 08                   je     18 <bar+0x18>
  10:   c9                      leave
  11:   e9 fc ff ff ff          jmp    12 <bar+0x12>
  16:   89 f6                   mov    %esi,%esi
  18:   c9                      leave
  19:   e9 fc ff ff ff          jmp    1a <bar+0x1a>

تعليمات 3 بايت ل CMP. إذا FOO () إرجاع Char، نحصل على B: 3C 1F CMP $ 0x1f،٪ al

إذا كنت تبحث عن كفاءة رغم ذلك. لا تفترض أن القارنات بالأشياء في٪ A1 أسرع من مقارنة مع٪ EAX

نصائح أخرى

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

وإذا كنت تتحدث عن X86 في المثال، فأنت تعطي، فأنت تؤدي إلى افتراض خاطئ: يجب أن تكون هناك حاجة فورية uint8_t.

في الواقع 8 بت فورا مضمن في التعليمات من النوع int8_t ويمكن استخدامها مع البايتات والكلمات وال Dwords و Qwords، في التدوين C: char, short, int و long long.

لذلك في هذه البنية، لن تكون هناك فائدة على الإطلاق، ولا حجم التعليمات البرمجية ولا سرعة التنفيذ.

يجب عليك استخدام أنواع INT أو غير موقعة لحساباتك. باستخدام أنواع أصغر فقط للمركبات (الهياكل / الصفائف). السبب في ذلك هو أنه يتم تعريف INT بشكل طبيعي أن يكون النوع المتكامل "الأكثر طبيعية" للمعالج، ويمكن أن يتطلب كل هذا النوع المشتق آخر معالجة للعمل بشكل صحيح. كان لدينا في مشروعنا الذي تم تجميعه مع دول مجلس التعاون الخليجي على Solaris for SPARC، الحالة التي تصل إلى 8 و 16 بت متغير إضافة تعليمات إلى التعليمات البرمجية. عند تحميل نوع أصغر من الذاكرة، كان عليه التأكد من تعيين الجزء العلوي من السجل بشكل صحيح (امتداد علامة للنوع الموقع أو 0 ل غير الموقع). هذا جعل الكود أطول وزيادة الضغط على السجلات التي تدهورت التبرعات الأخرى.

لدي مثال ملموس:

أعلنت اثنين من متغير من بنية مثل UINT8_T وحصلت على هذا الرمز في SPARC ASM:

    if(p->BQ > p->AQ)

ترجمت في

ldub    [%l1+165], %o5  ! <variable>.BQ,
ldub    [%l1+166], %g5  ! <variable>.AQ,
and     %o5, 0xff, %g4  ! <variable>.BQ, <variable>.BQ
and     %g5, 0xff, %l0  ! <variable>.AQ, <variable>.AQ
cmp     %g4, %l0    ! <variable>.BQ, <variable>.AQ
bleu,a,pt %icc, .LL586  !

وهنا ما حصلت عليه عندما أعلنت المتغيرين مثل UINT_T

lduw    [%l1+168], %g1  ! <variable>.BQ,
lduw    [%l1+172], %g4  ! <variable>.AQ,
cmp     %g1, %g4    ! <variable>.BQ, <variable>.AQ
bleu,a,pt %icc, .LL587  !

اثنين من العمليات الحسابية أقل و 2 يسجل أكثر للأشياء الأخرى

يحب المعالجات عادة العمل مع أحجام السجل الطبيعية، والتي في C "INT".

على الرغم من وجود استثناءات، إلا أنك تفكر كثيرا في مشكلة غير موجودة.

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