आज तक, मैंने हमेशा सोचा था कि सभ्य कंपाइलर स्वचालित रूप से स्ट्रक्चर पास-बाय-वैल्यू को पास-बाय-रेफरेंस में कनवर्ट करते हैं यदि संरचना इतनी बड़ी है कि बाद वाला तेज़ होगा। मेरे सबसे अच्छे ज्ञान के लिए, यह एक ब्रेनर अनुकूलन की तरह लगता है। हालांकि, यह वास्तव में ऐसा होने के लिए मेरी जिज्ञासा को पूरा करने के लिए, मैंने सी ++ और D दोनों में एक साधारण परीक्षण केस बनाया और जीसीसी और डिजिटल मंगल डी दोनों के आउटपुट को देखा। दोनों ने 32-बाइट structs को मूल्य से पारित करने पर जोर दिया जब सभी प्रश्न में कार्य किया गया था सदस्यों को जोड़ना और मूल्यों को वापस करना, जिसमें पारित संरचना में कोई संशोधन नहीं हुआ। सी ++ संस्करण नीचे है।एक सामान्य अनुकूलन संदर्भ द्वारा संरचना पास क्यों नहीं है?
#include "iostream.h"
struct S {
int i, j, k, l, m, n, o, p;
};
int foo(S s) {
return s.i + s.j + s.k + s.l + s.m + s.n + s.o + s.p;
}
int main() {
S s;
int bar = foo(s);
cout << bar;
}
मेरा प्रश्न है, पास-दर-संदर्भ के बजाय वास्तव में ढेर पर उन सभी int
रों धकेलने के लिए क्यों हो कुछ इस तरह संकलक द्वारा अनुकूलित किया जाना नहीं होगा?
नोट: कंपाइलर स्विच का उपयोग किया गया: जीसीसी-ओ 2 (-ओ 3 इनलाइन फू()।), डीएमडी-ओ -इनलाइन- कृपया।
संपादित करें: जाहिर है, सामान्य मामले में पास-दर-मूल्य बनाम पास-बाय-रेफरेंस का अर्थशास्त्र समान नहीं होगा, जैसे कि प्रतिलिपि बनाने वाले शामिल हैं या मूल संरचना को कैली में संशोधित किया गया है । हालांकि, वास्तविक दुनिया के कई परिदृश्यों में, अर्थशास्त्र व्यवहार के व्यवहार में समान होगा। ये वे मामले हैं जिनके बारे में मैं पूछ रहा हूं।
लिंक-टाइम-ऑप्टिमाइज़ेशन करते समय, a.k.a. लिंक टाइम कोड जनरेशन या पूरे प्रोग्राम संकलन, कंपाइलर को केवल घोषणा के आधार पर कॉल को संकलित करने की आवश्यकता नहीं होती है। इसमें क्या हो रहा है में पूर्ण अंतर्दृष्टि है। एम्बेड किए गए अनुप्रयोगों को संकलित करने के लिए आकार और गति-संवेदनशील, लिंक टाइम कोड पीढ़ी वैसे भी जाने का एकमात्र तरीका है। –