2012-12-20 15 views
6

कुछ ब्लॉग और साइटों संकेत के बारे में बात कर रहे थे लाभकारी कारणों में से एक था, क्योंकि "निष्पादन की गति" संकेत के बिना से संकेत के साथ एक कार्यक्रम में बेहतर होगा रहे हैं।प्वाइंटर और निष्पादन की गति

  • एक ही स्थान अपसंदर्भन दो की आवश्यकता है (या अधिक) स्मृति (अविवेक की संख्या के आधार पर) तक पहुँचता है: बात मैं बाहर काम कर सकते हैं। जो निष्पादन समय को बढ़ाएगा, इसकी तुलना में सीधे इसका उपयोग किया गया था।

  • एक संरचना के लिए एक बड़े डेटाटाइप के लिए एक सूचक को पास करना फायदेमंद हो सकता है, क्योंकि केवल संरचना/संघ का पता कॉपी हो रहा है और यह मूल्य से पारित नहीं हो रहा है। इसलिए यह इस मामले में तेजी से होना चाहिए।

उदाहरण के लिए सिर्फ ताकत के रूप में किसी भी आवश्यकता के बिना संकेत शुरू करने से:

int a, b, *p, *q, c, *d; 
p = &a; 
q = &b; 
d = &c 

// get values in a, b 

*d = *p + *q; // why the heck this would be faster 
c = a + b;  // than this code? 

मैं gcc -S -masm=intel file.c का उपयोग कर सूचक संस्करण कोडांतरक उत्पादन जाँच लोड हो रहा है स्मृति का एक बहुत है और प्रत्यक्ष से dereferences के लिए भंडारण तरीका।

मैं कुछ याद आ रही है?

नोट: सवाल सिर्फ कोड से संबंधित नहीं है। कोड सिर्फ एक उदाहरण है। संकलक अनुकूलन पर विचार नहीं कर रहा है।

+1

"लाभकारी" या "बेहतर" केवल एक चीज की तुलना किसी अन्य चीज़ की तुलना में किया जा सकता है। तो सवाल यह है कि लेखक ने एक्जिक्यूटिन की गति की तुलना की है। गुजरने वाले structs बनाम के बारे में।संरचना पॉइंटर्स, पॉइंटर्स तेज़ होते हैं - यदि संबंधित संरचना का भारी उपयोग नहीं किया जाता है। अन्य चीजों के बारे में, यह काफी निर्भर करता है। – glglgl

+0

सबसे अच्छे मामले में दोनों संस्करण समकक्ष हैं क्योंकि संकलित प्रकार पहले से ही अव्यवस्थित हो सकते हैं यदि शामिल प्रकार ज्ञात हैं। '-O2' के साथ अपना उदाहरण संकलित करने का प्रयास करें और देखें कि पॉइंटर्स को कैसे अनुकूलित किया गया है। – matthias

+0

कंपाइलर अनुकूलन पर विचार नहीं करते, सवाल का मुख्य बिंदु यह है कि यदि पॉइंटर्स का उपयोग करना हमेशा कुछ "जादुई" कारणों के लिए निष्पादन गति को बढ़ाता है? या पॉइंटर्स को सामान्य चर के रूप में सोचा जाना चाहिए जो एक पूर्णांक धारण करते हैं जिसे हम स्मृति पते के रूप में उपयोग करना चाहते हैं, और कुछ वाक्यविन्यास द्वारा हम संकलक पहचानकर्ताओं को बताते हैं कि हम ऐसे मान रखने के लिए उपयोग करेंगे। – phoxis

उत्तर

6

मुझे लगता है कि अपने निष्कर्ष मूल रूप से सही हैं। लेखक का यह मतलब नहीं था कि अधिक पॉइंटर्स का उपयोग करना हमेशा सभी कोड को गति देगा। यह स्पष्ट रूप से बकवास है।

लेकिन कई बार कर रहे हैं जब यह तेजी से होता है कि डेटा की प्रतिलिपि के बजाय डेटा के लिए सूचक पारित करने के लिए।

1

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

अलावा कि अपनी समझ सही है

+0

किसी भी प्रकार के कंपाइलर अनुकूलन पर विचार नहीं करते, यह सिर्फ एक उदाहरण है। विचार करें कि यह एक समारोह के अंदर है। – phoxis

-1

मार्क बेयर्स बिल्कुल सही है। आप इस तरह के सरल कार्यक्रम में पॉइंटर्स की शक्ति का न्याय नहीं कर सकते हैं। इन्हें मेमोरी मैनेजमेंट को अनुकूलित करने और उन कार्यक्रमों के तेज़ी से निष्पादन के लिए उपयोग किया जाता है जहां डेटा संरचनाओं और संदर्भों के अत्यधिक उपयोग पते के माध्यम से किए जाते हैं। विचार करें कि जब आप कोई प्रोग्राम शुरू करते हैं तो लोड होने में कुछ समय लगता है लेकिन पॉइंटर्स और कौशल के कुशल उपयोग के साथ यदि प्रोग्राम एक सेकंड पहले भी लोड करता है तो यह एक बड़ी उपलब्धि है।

+0

प्रश्न सामान्य रूप से था, कोड एक उदाहरण था। – phoxis

1

आप अपने उदाहरण में सही कर रहे हैं - कि कोड धीमी चलाना शामिल है। एक जगह है जहाँ यह तेजी से किया जा सकता है जब एक समारोह कॉल करने:

void foo(Object Obj); 
void bar(const Object * pObj); 

void main() 
{ 
    Object theObject; 
    foo(theObject); // Creates a copy of theObject which is then used in the function. 
    bar(&theObject); // Creates a copy of the memory address only, then the function references the original object within. 
} 

bar तेजी के रूप में हम संपूर्ण वस्तु (यह मानते हुए वस्तु सिर्फ एक आधार डेटा प्रकार की तुलना में अधिक है) की प्रतिलिपि की जरूरत नहीं है है। हालांकि, अधिकांश लोग इस उदाहरण में एक सूचक के बजाय संदर्भ का उपयोग करेंगे।

void foobar(const Object & Obj); 
संबंधित मुद्दे