c++ - tutorial - क्या हम C तात्कालिक संकलक द्वारा तात्कालिक त्वरित कोड देख सकते हैं
the c++ programming language (4)
आप "-S" विकल्प का उपयोग करके जी ++ द्वारा उत्पन्न विधानसभा कोड को निश्चित रूप से देख सकते हैं।
मुझे नहीं लगता कि "C ++" समकक्ष टेम्पलेट कोड प्रदर्शित करना संभव है - लेकिन मैं फिर भी एक g ++ डेवलपर चाहता हूं कि क्यों इसमें झंकार करना - मुझे gcc की वास्तुकला का पता नहीं है।
असेंबली का उपयोग करते समय, आप परिणामी कोड की समीक्षा कर सकते हैं जो आपके फ़ंक्शन जैसा दिखता है। Gcc -S -O1 {yourcode.cpp} को चलाने के परिणामस्वरूप, मुझे यह मिला (AMD64, gcc 4.4.4)
_Z3addIiET_S0_S0_:
.LFB2:
.cfi_startproc
.cfi_personality 0x3,__gxx_personality_v0
leal (%rsi,%rdi), %eax
ret
.cfi_endproc
जो वास्तव में सिर्फ एक अतिरिक्त जोड़ (लीला) है।
अब, c ++ नेम मंगलर को कैसे डीकोड करना है? c ++ filt नामक एक उपयोगिता है, आप विहित (C- समतुल्य) नाम चिपकाते हैं और आपको ध्वस्त c ++ समतुल्य मिलता है
[email protected] /dev/shm $ c++filt
_Z3addIiET_S0_S0_
int add<int>(int, int)
वहाँ एक टेम्पलेट समारोह या C ++ में एक वर्ग के लिए संकलक त्वरित कोड को जानने का एक तरीका है
मान लें कि मेरे पास निम्नलिखित कोड है
template < class T> T add(T a, T b){
return a+b;
}
अब जब मैं फोन करूंगा
add<int>(10,2);
मैं उस फ़ंक्शन को जानना चाहूंगा जो कंपाइलर इंट विशिष्ट संस्करण के लिए बनाता है।
मैं G ++, VC ++ का उपयोग कर रहा हूं। यह उपयोगी होगा यदि कुछ मुझे इसे प्राप्त करने के लिए संकलक विकल्पों को इंगित करने में मदद कर सकते हैं।
आशा है कि प्रश्न स्पष्ट है। अग्रिम में धन्यवाद।
क्लैंग ( https://clang.llvm.org/ ) तत्काल टेम्पलेट के एएसटी को प्रिंट कर सकता है:
अपने उदाहरण के लिए:
test.cpp
template < class T> T add(T a, T b){
return a+b;
}
void tmp() {
add<int>(10,2);
}
एएसटी को प्रिंट करने के लिए कमांड:
$ clang++ -Xclang -ast-print -fsyntax-only test.cpp
Clang-5.0 आउटपुट:
template <class T> T add(T a, T b) {
return a + b;
}
template<> int add<int>(int a, int b) {
return a + b;
}
void tmp() {
add<int>(10, 2);
}
यदि आप असेंबली आउटपुट देखना चाहते हैं, तो इसका उपयोग करें:
g++ -S file.cpp
यदि आप कुछ (छद्म) C ++ कोड देखना चाहते हैं जो GCC जेनरेट करता है, तो आप इसका उपयोग कर सकते हैं:
g++ -fdump-tree-original file.cpp
अपने add
फंक्शन के लिए, यह कुछ इस तरह आउटपुट करेगा
;; Function T add(const T&, const T&) [with T = int] (null)
;; enabled by -tree-original
return <retval> = (int) *l + (int) *r;
(मैंने आउटपुट को थोड़ा और दिलचस्प बनाने के लिए संदर्भ द्वारा मापदंडों को पारित किया)
यदि आपके समकक्ष C ++ कोड की तलाश है तो नहीं। संकलक इसे कभी उत्पन्न नहीं करता है। यह संकलक के लिए बहुत तेज़ है, यह सीधे मध्यवर्ती प्रतिनिधित्व उत्पन्न करने के लिए है जो पहले c ++ उत्पन्न करता है।