मैंने एक संरचना लौटने वाले 2 सी कार्यों की तुलना की। हम जानते हैं कि एबीआई स्तर पर बड़े ढांचे को पहले फंक्शन तर्क के रूप में पॉइंटर द्वारा पारित किया जा रहा है।वास्तव में क्या मतलब है?
struct S {
int words[8];
};
struct S fsret() {
struct S s;
s.words[0] = 1;
return s;
}
void fout(struct S* s) {
s->words[0] = 1;
}
इन कार्यों के लिए मैंने x86_64 लिनक्स और विंडोज के लिए असेंबली की जांच की। fsret
को void @fsret(%struct.S* sret %s)
के रूप में घोषित किया गया है।
इन दो प्रकारों की तुलना में, कैली पक्ष पर कोई अंतर नहीं है। हालांकि, कार्यों के अंदर fsret
अतिरिक्त रूप से आरएक्स रजिस्टर में अपना पहला तर्क (संरचना के लिए सूचक) की प्रतिलिपि बनाता है। क्यूं कर?
क्या आप 'करते हैं अगर (fsret() शब्द [0] == 10।) {Do_something(); } '? कंपाइलर को उस मामले में वापसी मूल्य की आवश्यकता होती है (सुनिश्चित नहीं है, केवल एक विचार) –