में एक्सर ऑपरेशन का उपयोग नहीं करते हैं मैंने पाया है कि एक्सर ऑपरेशन प्रभावी स्वैप फ़ंक्शन को लागू करने के लिए उपयोग किया जा सकता है। इस तरह:क्यों स्वैप सी ++
template<class T>
void swap(T& a, T& b)
{
a = a^b;
b = a^b;
a = a^b;
}
लेकिन स्वैप के कार्यान्वयन सब मैं इंटरनेट पर पाया जा सकता है इस तरह अनिवार्य है:
template<class T>
void swap(T& a, T& b)
{
T temp(a);
a = b;
b = temp;
}
ऐसा लगता है कि संकलक दो फार्म के लिए एक ही कोड जनरेट नहीं किया था उपर्युक्त क्योंकि मैंने इसे वीसी ++ 2010 पर परीक्षण किया और पहला व्यक्ति नौकरी अधिक तेज़ी से कर चुका है (और std :: swap से अधिक तेज़ है)। क्या पहले पोर्टेबल या कोई अन्य समस्या है? मेरी किसी भी गलती को सही करने के लिए स्वतंत्र महसूस करें क्योंकि मैं एक अंग्रेजी मूल नहीं हूं और सी ++ में अच्छा नहीं हूं।
बस एक धारणा है: स्वैप के अपने संस्करण के साथ इस प्रयास करें कम से कम 86 सीपीयू [XCHG] (राशि http://pdos.csail.mit.edu/6.828/2008/readings/i386/XCHG.htm) निर्देश, जो तीन एक्सओआर से तेज है। – Joulukuusi
क्या आपने अपना परीक्षण ऑप्टिमाइज़ेशन सक्षम के साथ चलाया? –
@Joulukuusi x86 पर XCHG निर्देश कभी स्वैप प्रतिस्थापन के लिए नहीं था। मेमोरी ऑपरेंड पर इस्तेमाल होने पर इसका एक अंतर्निहित लॉक उपसर्ग होता है, इसे सिंक्रनाइज़ेशन के लिए एक उपकरण के रूप में उपयोग किया जाता है। 'XCHG reg, reg' का उपयोग संभवतः किया जा सकता है, हालांकि मुझे संदेह है कि इसकी कभी आवश्यकता है - रजिस्टरों का नाम बदलना भी तेज़ है। मैंने असेंबली की कुछ के लाइनें लिखी हैं, मैंने मूल्यों को स्वैप करने के लिए 'xchg' का उपयोग करने का आग्रह कभी नहीं किया है। – hirschhornsalz