2010-01-02 20 views
7

मैं गतिशील रूप से लोड की गई लाइब्रेरीज़ के लिए प्लेटफ़ॉर्म स्वतंत्र रैपर को कार्यान्वित करने की प्रक्रिया में हूं। बेशक जब मैं पुस्तकालयों से कार्यों को लोड करता हूं तो मुझे उन्हें भविष्य के उपयोग के लिए पॉइंटर्स के रूप में स्टोर करने की आवश्यकता होती है। मैंने सामान्य फ़ंक्शन पॉइंटर्स की बजाय बूस्ट :: फ़ंक्शन का उपयोग करने के बारे में सोचा। निश्चित रूप से, यह संकलन समय में वृद्धि करेगा, लेकिन यह वह नहीं है जो मुझे डरता है। इसके बजाय:बूस्ट :: फ़ंक्शन रन-टाइम प्रदर्शन

संग्रहीत फ़ंक्शन को कॉल करते समय बूस्ट :: फ़ंक्शन द्वारा ओवरहेड पेश किया गया है? क्या कोई है? वो कितना बड़ा है?

मुझे लगता है कि समय-समय पर ऐसे कार्यों को कॉल करते समय मुझे अधिक ओवरहेड नहीं होगा, हालांकि, कितने कार्यों को बुलाया जाता है? (चरम उदाहरण, glVertex एक लोड जीएल पुस्तकालय पर)। यह प्रदर्शन को कितना नुकसान पहुंचाएगा?

स्रोत-डाइविंग बूस्ट ने अधिक जवाब नहीं दिया:>।

यदि यह कंपाइलर निर्भर है, तो भी मुझे मुख्य रूप से जीसीसी और एमएसवीसी में दिलचस्पी है।

+0

उत्तर है: यह बहुत अधिक नुकसान पहुंचाएगा, इसका उपयोग न करें। – user1095108

उत्तर

5

चर्चा और विभिन्न फ़ंक्शन रैपर कार्यान्वयन की तुलना के लिए here देखें।

+0

यह वास्तव में एक बहुत ही रोचक तुलना है! –

+1

यह आलेख 2007 से है - क्या यह अभी भी प्रासंगिक है? – Adrian

+0

हम्म, अब 0x सामान के प्रकाश में पुराना हो सकता है ... –

5

जैसा कि बूस्ट documentation में बताया गया है, boost::function का आह्वान करते हुए अधिकांश मामलों में फ़ंक्शन पॉइंटर के माध्यम से एक कॉल की लागत होती है। दूसरे शब्दों में, यदि आपको किसी भी तरह फ़ंक्शन पॉइंटर्स का उपयोग करना होगा, तो यह एक धो है, और आपको मुफ्त में वर्धित कार्यक्षमता का एक गुच्छा मिलता है।

1

बढ़ावा :: फ़ंक्शन इसे tr1 में बना देता है, इसलिए यह आधुनिक कंपाइलर्स पर std :: tr1 :: फ़ंक्शन है, और केवल पर std :: फ़ंक्शन वास्तव में आधुनिक कंपाइलर।

किसी भी मामले में, जैसा कि आपने देखा है, std :: फ़ंक्शन में सृजन के लिए गैर-शून्य ओवरहेड है (ऑब्जेक्ट की प्रतियां बनाने सहित)। सिद्धांत रूप में, यह एक ही ओवरहेड होना चाहिए जो आमंत्रण के लिए कच्चे फ़ंक्शन पॉइंटर के रूप में हो; यानी एक स्तर का संकेत है - लेकिन वास्तव में स्मार्ट कंपाइलर उस स्तर के संकेत को रेखांकित कर सकते हैं।

निश्चित रूप से, आप एक std :: फ़ंक्शन में स्टोर कर सकते हैं जो किसी फ़ंक्शन पॉइंटर में फिट या संग्रहीत नहीं हो सकता है।

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