2010-10-05 6 views
6

मैं const के व्यवहार को समझता हूं - योग्य डेटा प्रकार। मैं उत्सुक हूं, हालांकि, अगर const के रूप में क्वालिफाइंग चर के ओवर-या ज़ोर से अधिक प्रदर्शन या हानि है। मैं विशेष रूप से घोषित चर के बारे में सोच रहा हूं और विशेष रूप से एक पृथक कोड ब्लॉक के भीतर उपयोग किया जाता हूं। उदाहरण के लिए, कुछ की तरह:क्या सी ++ चर घोषित करने से प्रदर्शन में मदद मिलती है या चोट पहुंचती है?

const qreal padding = CalculatePadding(); 
const QSizeF page_size = CalculatePagePreviewSize(padding); 
const QRectF content_rect = CalculatePagePreviewContentRect(page_size); 
const QList<QRectF> pages = renderer.BuildPrintPages(printer_, map_scene_); 
const QFont page_number_font = CalculatePageNumberFont(); 
const QFontMetrics metrics(page_number_font); 

मान लीजिए मैं केवल इन सभी से const -qualified तरीकों की जरूरत है वहां उन सब const घोषित करने में किसी भी प्रदर्शन लाभ है (और अधिक।)? या, इसके विपरीत, क्या यह वास्तव में प्रदर्शन को चोट पहुंचाता है?

मैं दोनों रन-टाइम प्रदर्शन के लिए उत्सुक हूँ (मैं अनुमान लगा रहा हूँ के रूप में विशेष रूप से const एक संकलन समय जांच है यह कोई फर्क नहीं पड़ता - किसी की पुष्टि कर सकते?) और संकलन समय प्रदर्शन। मेरे पास इसके लिए एक महसूस करने के लिए सी ++ के साथ पर्याप्त अनुभव नहीं है, और मुझे आश्चर्य है कि मुझे const के ऊपर या नीचे लागू होने के पक्ष में गलती करनी चाहिए जब अन्य सभी चीजें (रखरखाव, आदि) बराबर होती हैं।

+1

ज्यादातर मामलों में, कोई रन-टाइम प्रदर्शन अंतर – Anycorn

+2

डुप्ली? http://stackoverflow.com/questions/3435026/can-const-correctness-improve-performance – Anycorn

+0

क्यूटी बहुत कॉपी-ऑन-राइट है इसलिए मुझे संदेह है कि यहां का वास्तविक प्रभाव हो सकता है। –

उत्तर

20

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

2

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

इसका प्रदर्शन पर कोई महत्वपूर्ण प्रभाव नहीं होना चाहिए, लेकिन मुझे कोड रखरखाव की आसानी के लिए इसे और अधिक उपयोग करने में त्रुटि होगी। बस मेरी राय, यद्यपि।

1

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

0

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

+1

हर समय 'const_cast' से बचें, और केवल तभी उपयोग करें जब आपके पास कोई विकल्प न हो (उदाहरण के लिए: आप बाहरी lib के साथ काम कर रहे हैं, आप इंटरफेस को नहीं बदल सकते हैं, लेकिन एक कॉन्स्ट ऑब्जेक्ट को संशोधित करना "पर्याप्त सुरक्षित" है) । – rubenvb

+2

यह वास्तव में सच नहीं है। यदि आपने एक चर को कॉन्स्ट के रूप में परिभाषित किया है, तो आप इसे दूर नहीं कर सकते * और * इसे लिखें। एक कंपाइलर जो परिवर्तनीय मान को इस तथ्य के आधार पर कैश करता है कि परिवर्तनीय आधार है ठीक है। किसी भी प्रोग्राम जो एक कॉन्स वैरिएबल को लिखता है, वह अनिश्चित व्यवहार है। –

+0

जोहान्स - कॉन्स्ट और ऑप्टिमाइज़ेशन पर Google खोज से पहला परिणाम: http://www.gotw.ca/gotw/081.htm - इसे स्वयं आज़माएं, आप एक असंवैधानिक चर – miked

2

मेरे (सीमित) अनुभव में, कॉन्स बहुत प्रदर्शन से आश्चर्यचकित हो सकता है (आश्चर्य!) अर्थात्, जब कंटेनर कक्षाओं के साथ काम करते हैं तो सावधान रहें कि cont-ness क्या करता है: सरणी के लिए यह केवल कंपाइलर को आपके कंटेनर की एक प्रति बनाने के लिए मजबूर कर सकता है (उदाहरण के लिए, एक सरणी) एक बार एक तत्व को पढ़ने के लिए उपयोग किया जाता है ... यह एक विशाल था जिस कोड पर मैं काम कर रहा हूं उसमें पता लगाने के लिए दर्द।

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

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