2013-05-03 6 views
11

होनेI- से .member कम कुशल> सदस्य

struct Person { 
    string name; 
}; 

Person* p = ... 

मान लें कि कोई ऑपरेटरों अतिभारित रहे हैं (* i)।


कौन सा अधिक कुशल (यदि कोई है)?

(*p).nameबनामp->name

मेरे सिर के पीछे में कहीं न कहीं मैं, कुछ बज घंटी सुना है कि * भिन्नता ऑपरेटर एक वस्तु की अस्थायी प्रतिलिपि बना सकते हैं; क्या ये सच है?


इस सवाल की पृष्ठभूमि इस तरह के मामलों रहे हैं:

Person& Person::someFunction(){ 
    ... 
    return *this; 
} 

और मुझे आश्चर्य है कि करने के लिए, (शुरू किया, तो Person* के परिणाम और अंतिम पंक्ति को बदलने बस return this कोई फर्क होगा प्रदर्शन में)?

+0

इस बिंदु पर आपको पठनीयता के बारे में अधिक चिंता करनी चाहिए, और चूंकि '->' अधिक सामान्य वाक्य रचनात्मक चीनी है, '(* i) .m' कई स्थानों पर फहरा हुआ है। केवल अगर कोई प्रोफाइलिंग दिखाता है कि इससे संबंधित कोई समस्या हो सकती है तो आपको इसकी दक्षता के बारे में चिंता करना शुरू कर देना चाहिए। – PlasmaHH

+3

मैं उम्मीद करता हूं कि संकलक बिल्कुल उसी परिणाम का उत्पादन करे। आप इसे स्वयं जवाब दे सकते हैं, दोनों कोड को असेंबलर में संकलित कर सकते हैं और उत्पादित कोड की जांच कर सकते हैं। – bluehallu

+0

मैंने इस सवाल से पूछा कि * पृष्ठभूमि * मैंने वर्णित किया है - कई मूल ऑपरेटर आमतौर पर स्वयं का संदर्भ देते हैं, और मैं अक्सर उन्हें '* यह' वापस लौटता हूं; –

उत्तर

8

जब आप कोई संदर्भ वापस करते हैं, तो यह एक सूचक, पॉइंटर सेमेन्टिक्स को को छोड़कर बिल्कुल ठीक है।
आप sizeof(void*) तत्व वापस पास करते हैं, sizeof(yourClass) नहीं।

तो जब आप ऐसा करते हैं:

Person& Person::someFunction(){ 
    ... 
    return *this; 
} 

आप एक संदर्भ लौटने के लिए, और कहा कि संदर्भ एक सूचक की तुलना में एक ही आंतरिक आकार की है, इसलिए कोई क्रम अंतर है।

ही (*i).name के आपके उपयोग के लिए चला जाता है, लेकिन इस मामले में आप एक l-value है, जो एक संदर्भ के रूप में तो एक ही अर्थ विज्ञान है बनाना चाहते हैं (यह भी here देखें)

+0

यह वापसी के आकार के बारे में एक अच्छा बिंदु है। क्या आप समझा सकते हैं, फिर * * पी' क्या करता है? इसका परिणाम एक व्यक्ति और व्यक्ति है, या व्यक्ति व्यक्ति है? –

+0

आपको 'एल-वैल्यू' मिलता है, जो ऑब्जेक्ट के पते का संदर्भ देता है, अगर मैं http://stackoverflow.com/questions/11347111/dereferencing-a-pointer-when-passing-by-reference सही ढंग से पढ़ता हूं और विकिपीडिया के अनुसार: http://en.wikipedia.org/wiki/Value_(computer_science) – Gui13

+0

दिलचस्प लिंक में पढ़ता है, धन्यवाद :) –

9

कोई फर्क नहीं पड़ता। यहां तक ​​कि मानक कहता है कि दोनों बराबर हैं, और यदि वहां कोई कंपाइलर है जो दोनों संस्करणों के लिए समान बाइनरी उत्पन्न नहीं करता है, तो यह एक बुरा है।

+0

बिल्ट-इन प्रकारों और उपयोगकर्ता परिभाषित के लिए समान है ?? –

+3

@KalamarObliwy कोई ऑपरेटर ओवरलोडिंग मानते हैं, हाँ। –

+0

और मानक स्मार्ट पॉइंटर्स ('std :: unique_ptr',' std :: shared_ptr') के लिए, ओवरलोडेड ऑपरेटर अभी भी वही व्यवहार करते हैं। – MSalters

1

कोई भी अच्छा कंपाइलर एक ही परिणाम देगा। आप इसे स्वयं जवाब दे सकते हैं, दोनों कोड को असेंबलर में संकलित कर सकते हैं और उत्पादित कोड की जांच कर सकते हैं।

+2

https://ideone.com/Ovj7ao – BoBTFish

+0

@BoBTFish * voodoo * –

2

हाँ, यह बहुत कठिन है पढ़ सकते हैं और प्रकार है, इसलिए आप का उपयोग (*x).y से अधिक बेहतर कर रहे हैं - लेकिन टाइपिंग दक्षता के अलावा, बिल्कुल कोई अंतर नहीं है। संकलक अभी भी x का मूल्य को पढ़ने के लिए और उसके बाद y में जोड़ने के लिए ऑफसेट, चाहे आप एक या किसी अन्य [संभालने वहाँ निश्चित रूप से, कोई अजीब वस्तुओं/वर्गों शामिल है कि क्रमशः ओवरराइड operator-> और operator* हैं] का उपयोग की जरूरत है

(*x) संदर्भित होने पर निश्चित रूप से कोई अतिरिक्त वस्तु नहीं बनाई गई है। सूचक का मूल्य प्रोसेसर [1] में एक रजिस्टर में लोड किया जाता है। बस।

एक संदर्भ लौटने पर आम तौर पर अधिक कुशल होता है, क्योंकि यह ऑब्जेक्ट की एक प्रति बनाने के बजाय ऑब्जेक्ट में पॉइंटर (छद्म रूप में) देता है। ऑब्जेक्ट्स के लिए जो पॉइंटर के आकार से बड़े होते हैं, यह आम तौर पर एक जीत है।

[1] हां, हमारे पास ऐसे प्रोसेसर के लिए सी ++ कंपाइलर हो सकता है जिसमें रजिस्ट्रार नहीं हैं। मुझे रैंक-जेरोक्स से कम से कम एक प्रोसेसर पता है जिसे मैंने 1 9 84 में देखा था, जिसमें रजिस्ट्रार नहीं हैं, यह एक समर्पित लीएसपी प्रोसेसर था, और यह सिर्फ लीएसपी वस्तुओं के लिए एक ढेर है ... लेकिन वे आम से बहुत दूर हैं आज की दुनिया में। यदि कोई ऐसे प्रोसेसर पर काम कर रहा है जिसमें रजिस्ट्रार नहीं हैं, तो कृपया मेरे उत्तर को कम मत करें क्योंकि मैं उस विकल्प को कवर नहीं करता हूं। मैं जवाब को सरल रखने की कोशिश कर रहा हूं।

+3

-1 बिना प्रोसेसर पर विचार करने के लिए ... ओह, रुको। :) –

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