सी ++ कंप्यूटर मेमोरी के सैद्धांतिक मॉडल के खिलाफ संचालन के मामले में निर्दिष्ट है।
इसमें एक विशेषता भी है "as if" नियम के रूप में जाना जाता है।इसका मतलब है कि संकलक किसी भी कोड को पसंद कर सकता है, बशर्ते कि समग्र अवलोकन योग्य प्रभाव "जैसा है" आपके द्वारा लिखे गए कोड का शाब्दिक रूप से स्मृति मॉडल के खिलाफ संचालन में अनुवाद किया गया था।
unoptimised कोड में, कोडांतरक उत्पादन वास्तविकता बहुत संचालन के पास में है, कोड में व्यक्त के लिए उदाहरण जीसीसी अपने कार्य के लिए निम्न कोड का उत्पादन हो सकता है:
a(int): # @a(int)
push rbp
mov rbp, rsp
mov dword ptr [rbp - 4], edi
mov edi, dword ptr [rbp - 4]
shl edi, 1
mov dword ptr [rbp - 8], edi
mov eax, dword ptr [rbp - 8]
pop rbp
ret
और निम्नलिखित बुला कोड दिया:
extern void foo(int x);
int main()
{
foo(a(2));
}
निम्नलिखित कोड का उत्पादन किया जा सकता है:
main: # @main
push rbp
mov rbp, rsp
mov edi, 2
call a(int)
mov edi, eax
call foo(int)
xor eax, eax
pop rbp
ret
इस सरल कार्यक्रम में, कोड का अवलोकन प्रभाव यह है कि foo
को मूल्य 4 के तर्क के साथ बुलाया जाएगा। a
पर कॉल केवल एक अवलोकन दुष्प्रभाव है। यही है, यह वापसी मूल्य इसके इनपुट मूल्य को दोगुना कर देता है।
क्योंकि दिए गए मान foo
में सीधे पारित कर दिया है और कहीं भी संग्रहीत नहीं है, हम कह सकते हैं कि a
बुला के सभी दुष्प्रभाव पूरी तरह से foo
के लिए एक कॉल द्वारा खपत होती है।
इसलिए, यदि एक कंपाइलर जानता है कि a
क्या करता है, तो उसे कॉल करने के लिए कोड उत्पन्न करने की आवश्यकता नहीं है। यह foo
पर कॉल किया जा सकता है, जैसा कि 'as if' को a(2)
पर कॉल किया गया है।
इस प्रकार
main: # @main
push rax
mov edi, 4 # note: 'as if' a(2)
call foo(int)
xor eax, eax
pop rcx
ret
(जीसीसी पर) इस मामले में a
के कार्यान्वयन है::
दरअसल, अनुकूलन जोड़ने हमें इस देता है
a(int): # @a(int)
# 'as if' we created a variable and did some arithmetic,
# stored the result and then returned the result
lea eax, [rdi + rdi]
ret
कॉलिंग फ़ंक्शन केवल ईएक्स (या कहीं भी) – Caleth
का उपयोग करेगा क्या आप जानना चाहते हैं कि अन-अनुकूलित केस में क्या होता है? मैं पूछता हूं क्योंकि एक अच्छा पर्याप्त संकलक 'int foo = a (2);' '4' के साथ सीधे 'foo' प्रारंभ करने में बदल सकता है। – NathanOliver
फ़ंक्शन के लिए असेंबली भाषा आउटपुट करने के लिए अपने कंपाइलर को बताएं। –