2011-12-12 6 views
5

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

if(x < COMPILE_TIME_MIN or x > COMPILE_TIME_MAX) 
    return; 
// compiler will assume for code below that x is in range COMPILE_TIME_MIN..COMPILE_TIME_MAX 

लेकिन यह रनटाइम चेक है। शायद के बिना इस तरह की एक चेक के बारे में धारणा बनाने के लिए कंपाइलर प्राप्त करने के लिए कुछ चाल है?

+2

क्या आपके पास कोई विचार है कि यह किस तरह के अनुकूलन के साथ मदद करेगा? –

+0

यदि आप टेम्पलेट्स का उपयोग करते हैं, तो आप वास्तव में संकलन समय जांच सकते हैं यदि आपकी सभी जानकारी संकलन समय पर जानी जाती है। –

+0

आप "कंपाइलर" वाक्यांश का उपयोग कर रहे हैं, लेकिन आप हमें कभी नहीं बताते हैं। संभवतः आपका मतलब g ++ या Visual C++ का कुछ संस्करण है, लेकिन यह स्पष्ट नहीं है। सामान्य रूप से अनुकूलन मानक द्वारा संबोधित नहीं किया जाता है, इसलिए आप जो भी संभवतः यहां कर सकते हैं वह कार्यान्वयन-विशिष्ट है। –

उत्तर

6

ऐसा कोई भी "संकेत" संकलक-विशिष्ट होगा।

उदाहरण के तौर पर, विज़ुअल सी ++ आपको the __assume intrinsic का उपयोग करके इस तरह के एक संकेत प्रदान करने की अनुमति देता है।

(अन्य compilers भी इस तरह के intrinsics उपलब्ध करा सकता है, लेकिन मैं अन्य compilers के साथ पर्याप्त परिचित कोई और जानकारी देने के लिए नहीं कर रहा हूँ। अपने संकलक के दस्तावेज़ देखें यदि आप रुचि रखते हैं।)

+3

अपने स्वयं के गुगलिंग से, जीसीसी 4.5 और ऊपर इस जानकारी को '#define __assume (cond) {if (! (Cond)) __builtin_unreachable() का उपयोग करके उसी वाक्यविन्यास के साथ भी पास कर सकते हैं; } जबकि (0) ' –

+0

@DrewDormann दिलचस्प। मुझे लगता है कि एक एकल मैक्रो '# परिभाषित ASSUME_THIS_THING (x) ...' जो कि दृश्य C++ पर '__assume (x)' और जीसीसी पर आपके स्निपेट को परिभाषित करना बेहतर होगा। यह सबसे अच्छा है कि अपने स्वयं के मैक्रो को एक कंपाइलर-आरक्षित नाम (जैसे '__assume') के साथ परिभाषित न करें। –

+0

वाह, यह कमाल है। जेम्स, ड्रू की जानकारी को आपके जवाब में विलय करने की देखभाल करते हैं? फिर मैं स्वीकार्य के रूप में चिह्नित करेंगे। –

3

यह मानक नहीं है, लेकिन जीसीसी के साथ, __builtin_expect नामक एक कमांड आता है, जिसमें मैक्रोज़ likely और unlikely के रूप में परिभाषित किए गए हैं जो आपके उद्देश्य को पूरा करते हैं। उदाहरण के लिए here देखें जो कर्नेल-स्पेस में उनका उपयोग करने के बारे में बात करता है, लेकिन __builtin_expect एक जीसीसी एक्सटेंशन है और उपयोगकर्ता-स्पेस में भी उपयोग किया जा सकता है (this question देखें), भले ही likely और unlikely परिभाषित नहीं हैं।

+0

उपर्युक्त टिप्पणी में एक टाइपो है: यह '__builtin_expect' होना चाहिए। जीसीसी केवल उम्मीद के रूप में उम्मीद का उपयोग करता है: यह उन मामलों से नहीं बचेगा जहां उम्मीद पूरी नहीं हुई है। –

+0

@ मैटजी, हाँ मुझे नहीं पता कि मैंने 'buildtin' कैसे लिखा था! – Shahbaz

0

मुझे किसी भी सी ++ संकलन तकनीकों के बारे में पता नहीं है जो इस जानकारी का लाभ उठाते हैं, लेकिन मुझे विभिन्न स्थैतिक विश्लेषण तकनीकों के बारे में पता है; उन उपकरणों को भी इस तरह के "यदि स्थिति" के रूप में चीजों का विश्लेषण करने में सक्षम होगा खुद से

assert(x > COMPILE_TIME_MIN); 
assert(x < COMPILE_TIME_MAX); 

लेकिन आमतौर पर है, तो: आम तरीका है "बता" करने के लिए उन उपकरणों के लिए कुछ assert रों के माध्यम से हो सकता है, उदाहरण के लिए ऐसा करने की कोई विशेष आवश्यकता नहीं है।

इसके अतिरिक्त, यदि सीमा वास्तव में छोटी है, तो आप इसे छोटे आकार के चर में भी प्रस्तुत कर सकते हैं - उदा। एक छोटा या चार का उपयोग करना - और COMPILE_TIME_MIN जोड़ना। इससे ऐसे औजारों की मदद मिल सकती है, हालांकि मुझे संकलन के बारे में पता नहीं है।

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

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