2015-03-18 4 views
18

जीएनयू सी में __attribute__((const)) और __attribute__((pure)) के बीच क्या अंतर है?__attribute __ ((कॉन्स)) बनाम __attribute __ ((शुद्ध)) जीएनयू सी

__attribute__((const)) int f() { 
    /* ... */ 
    return 4; 
} 

बनाम

__attribute__((pure)) int f() { 
    /* ... */ 
    return 4; 
} 
+3

[यह] (https://gcc.gnu.org/onlinedocs/gcc-4.0।। 0/gcc/function-Attributes.html) मदद कर सकता है। – haccks

उत्तर

22
documentation for the ARM compiler से

(जो जीसीसी पर आधारित है):

__attribute__((pure)) समारोह विशेषता
कई कार्यों एक मूल्य के वापस जाने के लिए छोड़कर कोई प्रभाव पड़ता है, और उनके वापसी मूल्य केवल पैरामीटर और वैश्विक चर पर निर्भर करता है। इस प्रकार के कार्य डेटा प्रवाह विश्लेषण के अधीन हो सकते हैं और इसे समाप्त किया जा सकता है।

__attribute__((const)) फ़ंक्शन विशेषता
कई फ़ंक्शन केवल उन्हें दिए गए तर्कों की जांच करते हैं, और वापसी मूल्य को छोड़कर कोई प्रभाव नहीं पड़ता है। यह __attribute__((pure)) की तुलना में एक बहुत कठोर वर्ग है, क्योंकि वैश्विक स्मृति को पढ़ने के लिए किसी फ़ंक्शन की अनुमति नहीं है। यदि कोई फ़ंक्शन केवल अपने तर्कों पर काम करने के लिए जाना जाता है तो यह सामान्य उप-अभिव्यक्ति उन्मूलन और लूप अनुकूलन के अधीन हो सकता है।

तो, टीएल, डॉ: __attribute__((const))__attribute__((pure)) के रूप में लेकिन वैश्विक चर के लिए किसी भी उपयोग के बिना एक ही है।

+2

ध्यान दें कि एआरएम कंपाइलर '__pure' फ़ंक्शन क्वालीफायर भी प्रदान करता है, जो' शुद्ध 'विशेषता से कठोर है, और 'const' विशेषता के बराबर है। – ysap

+7

जीसीसी डॉक में पॉइंटर तर्कों के बारे में नोटिंग भी ध्यान देने योग्य है: 'ध्यान दें कि एक फ़ंक्शन जिसमें पॉइंटर तर्क हैं और डेटा की जांच की गई है, उसे' – origo

2

अंतर में GCC manuals

__attribute__ ((pure)) समझाया गया है इसका मतलब है समारोह कोई साइड इफेक्ट नहीं है और मान दिया तर्कों और वैश्विक चर की स्थिति पर निर्भर करता है। इसलिए ऑप्टिमाइज़र के लिए यह कुछ सुरक्षित कॉल करने के लिए सुरक्षित है, अगर तर्क समान हैं, और ग्लोबल्स की स्थिति कॉल के बीच में नहीं बदली है।

__attribute__ ((const)) मतलब यह है कि वापसी मान केवल तर्क के एक समारोह है, और अगर तर्क के किसी भी संकेत दिए गए हैं, तो संकेत dereferenced नहीं किया जाना चाहिए

const फ़ंक्शन हमेशा pure होता है।

const फ़ंक्शन के उदाहरण <math.h> से गणितीय कार्य होगा: sqrt, exp, आदि (हालांकि वे गोलाई मोड के अधीन हो सकता है)।

pure लेकिन गैर स्थिरांक फ़ंक्शन के उदाहरण strlen रूप में इस तरह के कार्यों होगा - के रूप में यह सूचक में पारित dereferences

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