السلام عليكم ورحمة الله وبركاته
يُفترض بأن كتابة 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
أم أنني لا زلت أجهل الاستفادة منهما ؟