वहाँ भूमि के ऊपर एक std::function
के रूप में यह भंडारण के द्वारा lambdas रिकर्सिवली उपयोग कर रहा है, हालांकि वे खुद को मूल रूप से functors हैं। ऐसा लगता है कि gcc
अच्छी तरह अनुकूलित करने में सक्षम नहीं है जिसे सीधे comparison में देखा जा सकता है।
लैम्ब्डा के व्यवहार को कार्यान्वित करना, यानी एक मजेदार बनाने वाला, gcc
को फिर से अनुकूलित करने में सक्षम बनाता है। एक लैम्ब्डा के अपने विशिष्ट उदाहरण के रूप में
struct HelloWorldFunctor
{
void operator()(int count) const
{
std::cout << "Hello world" << std::endl;
if (count > 1)
{
this->operator()(count - 1);
}
}
};
int main()
{
HelloWorldFunctor functor;
functor(2);
}
उदाहरण मैं functor इस second demo में कैसा दिखेगा बनाए हैं उनके लिए लागू किया जा सकता।
यहां तक कि अगर ऐसे ही एक std::rand
के रूप में अशुद्ध कार्यों के लिए कॉल का परिचय है, एक पुनरावर्ती लैम्ब्डा के बिना या एक कस्टम functor साथ प्रदर्शन अभी भी बेहतर है। यहां एक third demo है।
निष्कर्ष: std::function
के उपयोग के साथ, ओवरहेड है, हालांकि यह उपयोग के मामले के आधार पर नगण्य हो सकता है। चूंकि यह उपयोग कुछ कंपाइलर अनुकूलन को रोकता है, इसलिए इसका व्यापक रूप से उपयोग नहीं किया जाना चाहिए।
आपकी मुख्य समस्या कम संकलक अनुकूलन होगी http://ideone.com/QsZVfH – stefan
अच्छा! क्या आपको पता है क्यों? कंपाइलर यह अनुमान लगा सकता था कि यह कोड एक नियमित फ़ंक्शन कॉल के समान है (कोई कैप्चर नहीं है लेकिन खुद)? – 3XX0
@fscan मुझे बाद में यह एक रिकर्सिव लैम्ब्डा फ़ंक्शन है। टाइप अनुमान – 3XX0