2009-10-06 16 views
18

मुझे सी ++ प्रतिनिधियों के निम्नलिखित दृष्टिकोणों से अवगत है:फास्ट सी ++ प्रतिनिधि

। शुद्ध आभासी कार्यों के साथ इंटरफेस
Boost.Function
The Fastest Possible C++ Delegates
The Impossibly Fast C++ Delegates
Fast C++ Delegates
Fast C++ Delegate: Boost.Function 'drop-in' replacement and multicast

प्रत्येक के पास उनके पेशेवर और विपक्ष हैं। कुछ तेज़ होते हैं, कुछ अधिक लचीले होते हैं, कुछ अधिक फीचर समृद्ध होते हैं, कुछ अधिक मानक-अनुरूप होते हैं और कुछ अधिक पोर्टेबल होते हैं, लेकिन मैं व्यक्तिगत रूप से खुद को तीसरे का शौक ढूंढता हूं: सर्गेई रियाज़ानोव की असंभव फास्ट सी ++ प्रतिनिधि। हालांकि समस्या यह है कि उनके प्रतिनिधि तुलनात्मक नहीं हैं:

मेरे प्रतिनिधियों की तुलना नहीं की जा सकती है। तुलना ऑपरेटर परिभाषित नहीं किए जाते हैं क्योंकि एक प्रतिनिधि में विधि के लिए सूचक नहीं होता है। एक स्टब फ़ंक्शन के लिए पॉइंटर विभिन्न संकलन इकाइयों में भिन्न हो सकता है।

जो एक पाठकों ने जवाब दिया:

"सूचक एक ठूंठ कार्य करने के लिए विभिन्न संकलन इकाइयों में अलग हो सकता है।" AFAIK, यह सच नहीं है। कंपाइलर्स को विभिन्न संकलन इकाइयों में उत्पन्न टेम्पलेट कार्यों का पुन: उपयोग करने की आवश्यकता होती है (मुझे यकीन है कि - लेकिन मुझे लगता है कि बोर्लैंड ने एक बार इस नियम का उल्लंघन किया था)। मुझे लगता है कि ऐसा इसलिए है क्योंकि कक्षाएं ('नामहीन' नामस्थानों में नहीं) बाहरी संबंध का उपयोग करती हैं और जिस तरह से आप स्टब फ़ंक्शंस का उपयोग करते हैं, वे हमेशा इनलाइन होने से रोकते हैं (हालांकि यह फ़ंक्शन का पता लेने के रूप में कोई मुद्दा नहीं होना चाहिए एक गैर-इनलाइन संस्करण उत्पन्न करने के लिए मजबूर करेगा और लिंकर द्वारा निष्पादित 'बाहरी लिंक' सभी को समान रूप से नामित फ़ंक्शन को समाप्त कर देगा (उन्हें माना जाता है और मानक द्वारा समान होना आवश्यक है)) ...

यदि आप टेम्पलेट फ़ंक्शन को एक अनुवाद इकाई (सीपीपी फ़ाइल) परिभाषित करें और फिर एक ही फ़ंक्शन को दूसरी अनुवाद इकाई में अलग-अलग परिभाषित करें, केवल दो संस्करणों में से एक इसे अंतिम निष्पादन योग्य में लाएगा। (यह वास्तव में "एक परिभाषा नियम" का उल्लंघन करता है, लेकिन कम से कम ... जीसीसी पर काम करता है ... एमएसवीसी के बारे में निश्चित नहीं है।) मुद्दा यह है: विभिन्न इकाइयों में पता [स्टब का पता] समान होगा।

यदि आप एमएसवीसी के लिए यह सच मानते हैं तो मैं आपको लेख (तुलनात्मक क्षमता सहित) को अपडेट करने का आग्रह करता हूं - यदि एमएसवीसी मानक संबंध है, तो इस संबंध में।

अब लेख चार साल का है और लेखक ने पिछले तीन वर्षों के दौरान किसी भी टिप्पणी का जवाब नहीं दिया है, इसलिए मैं सोच रहा हूं कि उपर्युक्त टिप्पणी में कोई योग्यता है या नहीं तुलनात्मक रूप से तुलना करने के लिए कार्यान्वयन वास्तव में बदला जा सकता है। क्या सी ++ मानक विशेष रूप से इस तरह के उपयोग को प्रतिबंधित करता है और यदि हां, तो क्या हाल ही में किसी भी कंपाइलर्स वास्तव में मानक-अनुरूप हैं?

धन्यवाद।

+1

भले ही कथन सत्य था, फिर भी अन्य प्रतिनिधियों को अन्यथा अप्रयुक्त सदस्य जोड़कर तुलना आसानी से जोड़ा जा सकता है। – MSalters

उत्तर

11

कोड दोनों मानक अनुपालन और ठीक है। मुझे कोई भी स्थान नहीं दिखता है जहां वह ओडीआर का उल्लंघन करता है, और यह सच है कि एक ही टेम्पलेट पैरामीटर के साथ एक फ़ंक्शन टेम्पलेट के सभी इंस्टॉलेशन में "एक ही पता" होना चाहिए (एक अर्थ में कि फ़ंक्शंस के पॉइंटर्स सभी बराबर होना चाहिए) - कैसे यह हासिल किया जाना महत्वपूर्ण नहीं है। आईएसओ सी ++ 03 14.5.5.1 [temp.over.link] नियमों का अधिक विस्तार से वर्णन करता है।

तो, तुलनात्मक रूप से एक अनुरूप और पोर्टेबल तरीके से तुलना की जा सकती है।

+0

क्या होगा यदि टेम्पलेट इंस्टॉलेशन अलग-अलग DLL में रहते हैं? या मुख्य डीएलएल में मुख्य आवेदन और दूसरों में से एक? – user1095108

+0

मानक वास्तव में डीएलएल/साझा पुस्तकालयों की धारणा से निपटता नहीं है। अभ्यास में, ज़ाहिर है, क्योंकि वे संकलित और अलग से जुड़े हुए हैं, इसलिए कंपेलरों को तत्काल विलय करने का कोई तरीका नहीं है। तो, हाँ, वह एक गोचा होगा। –

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