यह मुझे लगता है कि यह सी और सी ++ दोनों में पूंछ-पुनरावृत्ति अनुकूलन करने के लिए पूरी तरह से अच्छी तरह से काम करेगा, फिर भी डिबगिंग के दौरान मुझे कभी भी एक फ्रेम स्टैक नहीं दिखता है जो इस अनुकूलन को इंगित करता है। यह अच्छा है, क्योंकि स्टैक मुझे बताता है कि रिकर्सन कितना गहरा है। हालाँकि, अनुकूलन एक तरह से अच्छा होगा।
क्या कोई C ++ कंपाइलर इस ऑप्टिमाइज़ेशन को करता है? क्यों? क्यों नहीं?
मैं इसे करने के लिए संकलक को कैसे बताऊं?
- MSVC के लिए:
/O2
या/Ox
- जीसीसी के लिए:
-O2
या-O3
कैसे की जाँच करें कि संकलक ने एक निश्चित मामले में ऐसा किया है?
- MSVC के लिए, PDB आउटपुट को कोड का पता लगाने में सक्षम करें, फिर कोड का निरीक्षण करें
- GCC के लिए ..?
मैं अब भी सुझाव दूंगा कि कैसे निर्धारित किया जाए कि एक निश्चित फ़ंक्शन को कंपाइलर द्वारा इस तरह से ऑप्टिमाइज़ किया गया है (भले ही मुझे यह आश्वस्त लगता है कि कोनराड मुझे यह मानने के लिए कहता है)
यह जांचना हमेशा संभव होता है कि क्या कंपाइलर अनंत पुनरावृत्ति करके यह जाँचता है कि क्या यह अनन्त लूप या स्टैक ओवरफ्लो में परिणाम देता है या नहीं (मैंने जीसीसी के साथ ऐसा किया और पता चला कि -O2
यह पर्याप्त है), लेकिन मैं बनना चाहता हूं एक निश्चित फ़ंक्शन की जांच करने में सक्षम जो मुझे पता है कि वैसे भी समाप्त हो जाएगा। मैं इस जाँच का एक आसान तरीका है प्यार करता हूँ :)
कुछ परीक्षण के बाद, मुझे पता चला कि विनाशकारी इस अनुकूलन को बनाने की संभावना को बर्बाद करते हैं। यह कभी-कभी इसके लायक हो सकता है कि रिटर्न-स्टेटमेंट शुरू होने से पहले वे कुछ वैरिएबल और टेम्पररी की स्कोपिंग को बदल दें और सुनिश्चित करें कि वे दायरे से बाहर हो जाएं।
यदि टेल-कॉल के बाद किसी भी विध्वंसक को चलाने की आवश्यकता है, तो टेल-कॉल ऑप्टिमाइज़ेशन नहीं किया जा सकता है।