2012-07-31 33 views
13

के साथ प्रतिस्थापित किया गया है तो GCC: __builtin_memcpy में C99/posix memcpy फ़ंक्शन का एक संस्करण है।जब __builtin_memcpy को libc के memcpy

कभी-कभी इसे जीसीसी द्वारा memcpy के इनलाइन संस्करण में प्रतिस्थापित किया जा सकता है और अन्य मामलों में इसे libc की memcpy पर कॉल करके प्रतिस्थापित किया जाता है। जैसे यह here नोट किया गया था:

अंत में, एक संकलक नोट पर, __builtin_memcpy वापस एक memcpy फ़ंक्शन कॉल उत्सर्जन करने के लिए गिर सकता है।

इस चयन में तर्क क्या है? क्या यह अन्य जीसीसी-संगत कंपाइलर्स, जैसे क्लैंग/एलएलवीएम, इंटेल सी ++ कंपाइलर, पीसीसी, सनक (ऑरैकल स्टूडियो) में तर्क है?

जब मुझे सादे memcpy पर __builtin_memcpy का उपयोग करना पसंद करना चाहिए?

+2

ऐसा प्रतीत होता है कि यह एक इनलाइन संस्करण का उपयोग करता है जब आकार संकलित समय स्थिर होता है और यह 8192 से कम या उसके बराबर होता है। –

उत्तर

14

मैं कुछ समय पहले बिल्टिन प्रतिस्थापन के साथ प्रयोग कर रहा था और मुझे पता चला कि <string.h> फ़ंक्शन केवल तभी प्रतिस्थापित किए जाते हैं जब स्रोत तर्क का आकार संकलन समय पर ज्ञात हो सकता है। इस मामले में libc पर कॉल सीधे अनलॉक कोड द्वारा प्रतिस्थापित किया जाता है।

जब तक आप -fno-builtins, -ansi, -std=c89 या कुछ इसी तरह के साथ संकलन, यह वास्तव में कोई फर्क नहीं पड़ता मौसम तुम __builtin_ उपसर्ग उपयोग करने या न।

हालांकि यह पालन करना मुश्किल है, कोड जो लाइब्रेरी कॉल को छोड़ने या कोड का एक हिस्सा निकालने का दावा करता है, here लगता है।

+0

कौन सा जीसीसी संस्करण और अनुकूलन स्तर का अध्ययन किया गया था? – osgx

+0

'जीओसी' संस्करण 4.6 'ओओ 3' और '-फॉमिट-फ्रेम-पॉइंटर' का उपयोग कर। जवाब देने से पहले मैंने 4.7 के साथ परीक्षण किया। – C2H5OH

+0

-O0 के लिए परिणाम क्या है? – osgx