2012-02-25 23 views
8

कैसे (जीसीसी/"जीएनयू सी" में) आप एक फ़ंक्शन पॉइंटर घोषित करते हैं जो __attribute__((const)) फ़ंक्शन को इंगित करता है? विचार यह है कि मैं चाहता हूं कि संकलक फ़ंक्शन पॉइंटर के माध्यम से फ़ंक्शन में एकाधिक कॉल उत्पन्न करने से बचें, जब यह पिछले कॉल से रिटर्न वैल्यू कैश कर सकता है।फंक्शन पॉइंटर __attribute __ ((कॉन्स)) फ़ंक्शन?

+0

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

+1

@Vlad: मैंने इसके बारे में भी सोचा, लेकिन फिर जीसीसी ने उन मामलों में फ़ंक्शन को इनलाइन करने से इनकार कर दिया जहां मैं इसे चाहता हूं। मूल रूप से मेरे पास एक रैपर फ़ंक्शन था, लेकिन मैंने इनलाइन व्यवहार को ठीक करने के लिए इसे हटा दिया। यदि यह दिलचस्प है, तो प्रश्न में कार्य '((pthread_t (*) (शून्य)) 0xffff0fe0)' (लिनक्स-एआरएम गेट-थ्रेड-पॉइंटर फ़ंक्शन) है। –

+0

दिलचस्प सवाल। क्या जस्टिन के जवाब का वांछित परिणाम था? – Praxeolitic

उत्तर

3
typedef void (*t_const_function)(void) __attribute__((const)); 

static __attribute__((const)) void A(void) { 
} 

static void B(void) { 
} 

int main(int argc, const char* argv[]) { 
    t_const_function a = A; 

    // warning: initialization makes qualified 
    // function pointer from unqualified: 
    t_const_function b = B; 

    return 0; 
} 

या बस:

__attribute__((const)) void(*a)(void) = A; 
+0

ब्लेह, 'टाइपपीफ' हमेशा समाधान होता है जब आपके पास एक ग़लत फ़ंक्शन पॉइंटर प्रकार होता है। स्वीकार किए जाते हैं। लेकिन क्या कोई विचार है कि मुख्य प्रश्न पर 'टाइपिफ' के बिना मेरी टिप्पणी में कलाकार लिखने का कोई तरीका है? –

+0

@ आर। दुर्भाग्यवश, मैं * नहीं जानता * यह सब कुछ एक टाइप में 'टाइपिफ' के बिना कैसे हवा में घुमाएगा - यह जीसीसी 4.2 पर संभव नहीं प्रतीत होता है। '((__attribute __ ((const)) pthread_t (*) (शून्य)) 0xffff0fe0) 'मुझे लगता है कि यह कैसे किया जाएगा, लेकिन यह आपकी इच्छा से अलग है (ऐसा लगता है कि जीसीसी रिटर्न प्रकार में विशेषता लागू करता है, नहीं कार्यक्रम)। – justin

0

हालांकि यह काफी अपने प्रश्न का उत्तर नहीं है, तो आप शायद यह जानना चाहता हूँ:

आप संकलक अनुकूलन आप यहाँ उम्मीद प्रदर्शन करने के लिए सामान्य स्थिति में नहीं उम्मीद कर सकते हैं। संकलक सामान्य मामले में नहीं कर सकता है कि उपनाम विश्लेषण यह जानने के लिए आवश्यक है कि फ़ंक्शन पॉइंटर के एकाधिक उपयोग एक ही फ़ंक्शन से मेल खाते हैं।

पॉइंटर के माध्यम से फ़ंक्शन के दो आमंत्रणों के बीच एक फ़ंक्शन कॉल, सामान्य स्थिति में, सूचक सामग्री को बदल सकता है, इस प्रकार दूसरे कॉल में आवंटित फ़ंक्शन अलग हो सकता है।

सी की प्रकृति के कारण, उचित उपनाम विश्लेषण करना अक्सर अक्रामक होता है, और इस तरह के अनुकूलन होने की संभावना नहीं है।

+2

यही है __attribute __ ((const)) करता है - यह संकलक को बताता है कि आप बेहतर जानते हैं और कुछ अनुकूलन के लिए हरे रंग की रोशनी देता है। –

+0

मेरे मामले में यह जान सकता है, हालांकि, क्योंकि सूचक एक अक्षर शाब्दिक है (फ़ंक्शन पॉइंटर पर एक पूर्णांक कास्ट)। टिप्पणियां देखें। –

+2

@Vlad: मुझे लगता है कि पेरी का मुद्दा यह था कि भले ही फ़ंक्शन-टू-फ़ंक्शन 'कॉन्स्ट' है, फिर भी कंपाइलर को यह सुनिश्चित करना होगा कि * पॉइंटर * इनवॉक्शंस के बीच नहीं बदला गया हो। लेकिन यह निर्धारित करना बहुत मुश्किल नहीं है, और मेरे मामले में यह संभव नहीं है क्योंकि यह एक शाब्दिक पूर्ण पता है। –

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