الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[تمت الإجابة] لا أرى فائدةً لكل من register , inline !

بدأه مصطفى 36a2 في 7 نوفمبر 2013 · 2 رد · 940 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

يُفترض بأن كتابة register تجعل المتغيّر المعرّف بعده , قاطناً ( ما أمكن ) في مسجّل من مسجلات المعالج
وهذا يوفّر تعليمة mov في كل مرة نستعمل فيها هذا المتغيّر ..
ولكن هذا الكلام عام جداً .. فعندما لا يجد المصرّف لزوماً لذلك فلن تستفيد من كتابة register !

وتقوم التعليمة inline كما يُفترض , بنسخ محتوى الدالة إلى مكان استدعائها عوضاً عن القيام بـ call ثم jmp إلى مكان الدالة وعند الانتهاء ret ولا ننسى الكثير من push و pop

بالنسبة لـregister .. فقد جرّبت الكود التالي وكانت بلا فائدة:
الكود مع تعليمات الأسمبلي التي ينفّذها الـمصرّف VC

    register int x=0;
00DA14FE  mov         dword ptr [x],0
    int y=x;
00DA1505  mov         eax,dword ptr [x]
00DA1508  mov         dword ptr [y],eax
    int z=x;
00DA150B  mov         eax,dword ptr [x]
00DA150E  mov         dword ptr [z],eax
    int n=x;
00DA1511  mov         eax,dword ptr [x]
00DA1514  mov         dword ptr [n],eax

وحتى مع كود يحتاج التسريع بالفعل

    for(register int x=0;x<1000;x++);
000D14FE  mov         dword ptr [x],0
000D1505  jmp         main+30h (0D1510h)
000D1507  mov         eax,dword ptr [x]
000D150A  add         eax,1
000D150D  mov         dword ptr [x],eax
000D1510  cmp         dword ptr [x],3E8h
000D1517  jge         main+3Bh (0D151Bh)
000D1519  jmp         main+27h (0D1507h)

كان بالإمكان أن يتكرّم المصرّف ويقوم بالعمل التالي

mov         eax,0
jmp         main+xxh (xxxxxxh)
add            eax,001h
cmp         eax,3E8h
jge         main+xxh (xxxxxxh)
jmp         main+xxh (xxxxxxh)
;العناوين محذوفة للتبسيط

فهل التعليمة register غير مدعومة إلى هذه الدرجة ؟

بالنسبة لـinline ..
أيضاً نفس المشكلة !
قمت بتعريف الدالة كما يلي:

inline int call(){    return 0;}

بلا فائدة

int x=call();
000614FE  call        call (611F4h)
00061503  mov         dword ptr [x],eax

وحتى لو قمنا بعمليات حسابية على الوسطاء
 

inline int call(int x,int y){    return x+y;}

لا فائدة .. (مثل قلتها)

    int x=call(1,2);
00CE14FE  push        2    
00CE1500  push        1    
00CE1502  call        call (0CE11F9h)
00CE1507  add         esp,8
00CE150A  mov         dword ptr [x],eax

فهل أُلغي الدعم عنها أيضاً !! أم أن VC يضحك على سترؤسترب ولا يترجم بأمانة :D


أم أنني لا زلت أجهل الاستفادة منهما ؟
 

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 7 نوفمبر 2013 في 23:04 — السبب: add eax,001h

#2

داخل 7.1.1.3 من C++03 Standard:

اقتباس

A register specifier has the same semantics as an auto specifier together with a hint to the implementation
that the object so declared will be heavily used.
[Note: the hint can be ignored and in most implementations
it will be ignored if the address of the object is taken.
—end note]


داخل 7.1.2:

اقتباس

A function declaration (8.3.5, 9.3, 11.4) with an inline specifier declares an inline function. The inline
specifier indicates to the implementation that inline substitution of the function body at the point of call is
to be preferred to the usual function call mechanism.
An implementation is not required to perform this
inline substitution at the point of call;
however, even if this inline substitution is omitted, the other rules for
inline functions defined by 7.1.2 shall still be respected.

 
الخلاصة:
1- register لا يتم إستخدامها إلا فى الأكواد القديمة و وجودها فقط لجعل إمكانية ترجمة البرامج القديمه ممكنة مع المترجمات الحديثة.
2- inline هى تشجيع للمبرمج لإستبدال الـ function-like macro بـ function حقيقة حيث يتم تطبيق عليها type checking مع إمكانية وضع محتواها مكان الإستدعاء إذا كان ذلك لن يضر بكفاءة البرنامج ككل.
 
عند تفعيل التحسينات حتى مع مقدار اهمية pure virtual function فإنه يتم حذفها فى بعض الحالات فما بالك بالدوال العادية و لا سيما الـ inline functions.
 
للعلم فقط: أسئلتك تنم عن شغف للتعلم و اغلب الإجابات موجوده بشكل مفصل داخل الـ standard إن استطعت القراءة منه، فإن قررت القيام بذلك فتذكر انه مثل كتب القانون احيانا تجد بند يتم تفصيله لاحقا و بعدها يتم تخصيص حالات منه فإذا قرأت منه فلا تعتمد على ما تقرأ حتى تنتهي منه كله.
 
 
و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة C++er في 8 نوفمبر 2013 في 00:41

2

مدونتي: C++ Tips and Tricks

#3

جزاك الله خيراً ..

 

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

بإذن الله سأتابع القراءة  , وتشبيه كتب القانون دقيق بالفعل .. سلمت يداك :)

مواضيع مشابهة