2012-09-13 20 views
5

नीचे दिए गए कोड के साथ, क्या एक कंपाइलर बता सकता है कि a वास्तव में B का एक उदाहरण है और वर्चुअल टेबल लुकअप को अनुकूलित करता है?वर्चुअल टेबल लुकअप का अनुकूलन

#include <iostream> 

class A 
{ 
    public: 
    virtual void f() 
    { 
     std::cout << "A::f()" << std::endl; 
    } 
}; 

class B : public A 
{ 
    public: 
    void f() 
    { 
     std::cout << "B::f()" << std::endl; 
    } 
}; 

int main() 
{ 
    B b; 
    A* a = &b; 
    a->f(); 

    return 0; 
} 

अतिरिक्त प्रश्न Jonthan सेंग और reima के जवाब के बाद: में मामला जीसीसी प्रयोग किया जाता है, यह किसी भी झंडे का उपयोग करने के लिए मजबूर करने की यह vtable देखने का अनुकूलन करने के लिए आवश्यक हो सकता है?

+0

पक्का पता लगाने के लिए एक ही रास्ता विधानसभा को देखने के लिए है। लेकिन हाँ, devirtualization एक मानक संकलक अनुकूलन है। – Mysticial

+0

बस जीसीसी के लिए डिस्सेप्लर जोड़ा गया। मैंने बुनियादी अनुकूलन के लिए '-O1' ध्वज का उपयोग किया। – reima

उत्तर

5

Clang आसानी से यह अनुकूलन कर सकता है, और यहां तक ​​कि फ़ंक्शन कॉल को रेखांकित भी कर सकता है। यह उत्पन्न विधानसभा से देखा जा सकता:

Dump of assembler code for function main(): 
    0x0000000000400500 <+0>: push %rbp 
    0x0000000000400501 <+1>: mov %rsp,%rbp 
    0x0000000000400504 <+4>: mov $0x40060c,%edi 
    0x0000000000400509 <+9>: xor %al,%al 
    0x000000000040050b <+11>: callq 0x4003f0 <[email protected]> 
    0x0000000000400510 <+16>: xor %eax,%eax 
    0x0000000000400512 <+18>: pop %rbp 
    0x0000000000400513 <+19>: retq 

मैं printf के बराबर कॉल द्वारा std::cout << … की जगह, के रूप में यह बहुत disassembly में अव्यवस्था कम कर देता है की स्वतंत्रता ले लिया।

जीसीसी 4.6 भी मान सकते हैं कि कोई vtable देखने की जरूरत है, लेकिन इनलाइन नहीं करता है:

Dump of assembler code for function main(): 
    0x0000000000400560 <+0>: sub $0x18,%rsp 
    0x0000000000400564 <+4>: mov %rsp,%rdi 
    0x0000000000400567 <+7>: movq $0x4007c0,(%rsp) 
    0x000000000040056f <+15>: callq 0x400680 <B::f()> 
    0x0000000000400574 <+20>: xor %eax,%eax 
    0x0000000000400576 <+22>: add $0x18,%rsp 
    0x000000000040057a <+26>: retq 
+0

+1 जैसे विजुअल स्टूडियो 2010 भी इसे व्यर्थित करता है। लेकिन यह इसे रेखांकित नहीं करता है। – Mysticial

+0

इस समय मेरे पास केवल जीसीसी 4.4 है। यह -O3 साथ भी देखने का अनुकूलन करने के प्रतीत नहीं होता: subq \t $ 24,% आरएसपी .cfi_def_cfa_offset 32 ​​ movq \t $ _ZTV1B + 16, (% आरएसपी) movq \t% आरएसपी,% RDI कॉल \t * _ZTV1B +16 (% आरआईपी) xorl \t% eax,% eax addq \t $ 24,% आरएसपी .cfi_def_cfa_offset 8 सेवानिवृत्त – Ruup

+1

यह पेंच! बस इसे प्रारूपित नहीं कर सकता! – Ruup

-2

शायद यह कर सकता है - यह संकलक और अनुकूलन आवश्यकताओं के स्मारकों पर निर्भर करेगा।

लेकिन, यह एक कॉल है। आप इस कॉल को अनुकूलित करने की परवाह क्यों करते हैं? और, यदि आप परवाह करते हैं, तो इस कॉल के लिए सिर्फ सही प्रकार क्यों न प्राप्त करें?

अनुकूलन के बारे में सभी सवालों का पहला जवाब है, "आपको इसे अनुकूलित करने की आवश्यकता क्यों है?" एक प्रदर्शन उपकरण रिपोर्ट है कि 50% आवेदन समय एक स्थान है, और सवाल का उत्तर दिया गया है। "ओह, लेकिन इसका अक्षम," सबसे आम उत्तर, अनजान कोड की ओर जाता है जो वास्तव में अक्षम कोड को शायद ही कभी अनुकूलित करता है।

+1

मैंने डाउनवोट नहीं किया, लेकिन अगर ओपी परवाह नहीं है, तो इस सवाल से पूछा नहीं गया होगा। – Mysticial

+2

जब कोई कारण नहीं है तो लोग अक्सर ऑप्टिमाइज़ेशन की परवाह करते हैं। तो, मैं इसके बारे में एक प्रश्न पूछने जा रहा हूं। –

+0

उत्तर तब टिप्पणियों में होगा .. –

संबंधित मुद्दे