मान लीजिए मैं निम्नलिखित कोडक्या सी ++ कंपाइलर एक ही पॉइंटर पर दोहराए गए आभासी फ़ंक्शन कॉल को अनुकूलित कर सकते हैं?
void f(PolymorphicType *p)
{
for (int i = 0; i < 1000; ++i)
{
p->virtualMethod(something);
}
}
संकलक की भिन्नता कोड उत्पन्न होगा p
के virtualMethod
1 या 1000 बार vtable
प्रवेश? मैं माइक्रोसॉफ्ट के कंपाइलर का उपयोग कर रहा हूँ।
संपादित
यहाँ वास्तविक दुनिया मामले मैं देख रहा हूँ के लिए उत्पन्न विधानसभा है। line->addPoint()
चिंता का आभासी तरीका है। मेरे पास कोई असेंबली अनुभव नहीं है, इसलिए मैं धीरे-धीरे इस पर जा रहा हूं ...
; 369 : for (int i = 0; i < numPts; ++i)
test ebx, ebx
je SHORT [email protected]_SCANNE
lea edi, DWORD PTR [ecx+32]
npad 2
$L[email protected]_SCANNE:
; 370 : {
; 371 : double *pts = pPoints[i].SystemXYZ;
; 372 : line->addPoint(pts[0], pts[1], pts[2]);
fld QWORD PTR [edi+8]
mov eax, DWORD PTR [esi]
mov edx, DWORD PTR [eax+16]
sub esp, 24 ; 00000018H
fstp QWORD PTR [esp+16]
mov ecx, esi
fld QWORD PTR [edi]
fstp QWORD PTR [esp+8]
fld QWORD PTR [edi-8]
fstp QWORD PTR [esp]
call edx
add edi, 96 ; 00000060H
dec ebx
jne SHORT [email protected]_SCANNE
[email protected]_SCANNE:
; 365 : }
संकलक पूछो कोडांतरक कोड उत्पन्न करने के लिए पूर्ण अनुकूलन और पूरे कार्यक्रम अनुकूलन के साथ VS2012 इस कार्यक्रम को संकलित करता है और जाँच करें। –
इसे अनुकूलन के साथ संकलित करें और परिणामी जेनरेट कोड देखें। – Petesh
जोआचिम की टिप्पणी में जोड़ने के लिए - * जांच के अलावा अन्य खोजने के लिए कोई अन्य तरीका नहीं है। –