आप दो अलग-अलग मुद्दों को भ्रमित कर रहे हैं। आप मूल्य से किसी भी ऑब्जेक्ट को पास कर सकते हैं (जब तक यह कॉपी करने योग्य हो)।
एक रजिस्टर में या स्टैक पर पारित किया जाएगा या नहीं, कार्यान्वयन और विशेष रूप से, कॉलिंग सम्मेलन का उपयोग किया जाता है।
कुछ कॉलिंग सम्मेलनों के तहत, 8 बाइट्स (सामान्य उद्देश्य रजिस्टर आकार) से बड़े पैरामीटर स्टैक पर पारित किए जाएंगे। अन्य कॉलिंग सम्मेलनों के तहत, उन्हें कई रजिस्टरों में विभाजित किया जा सकता है।
कुछ के तहत, यह संभव है कि ऑब्जेक्ट्स कभी भी रजिस्टरों में उनके आकार के बावजूद पास हो जाएं।
इसी तरह, कुछ कॉलिंग सम्मेलनों में रजिस्टरों में सिम मूल्य (एसएसई/एवीएक्स) पारित किया जा सकता है, लेकिन हमेशा दूसरों में ढेर पर रखा जाएगा। और स्केलर फ़्लोटिंग-पॉइंट मानों के लिए भी यह सच हो सकता है।
लेकिन आप जो पूछ रहे हैं वह वास्तव में अर्थपूर्ण उत्तर नहीं दिया जा सकता है। किसी ऑब्जेक्ट को कॉपी करने की गति ऑब्जेक्ट के आकार से प्रभावित होती है, हां।यदि ऑब्जेक्ट एक पीओडी प्रकार है, और यह एक रजिस्टर में फिट बैठता है, तो यह को सरल mov
निर्देश के साथ कॉपी किया जा सकता है। कंपाइलर करेगा जो कंपाइलर पर है या नहीं।
और जाहिर है, वस्तु जितनी बड़ी होगी, उतनी अधिक कैश स्पेस लेती है, जिसका अर्थ है कि आपको अधिक कैश मिस मिलेंगे।
लेकिन यह सब अस्पष्ट है कि यह बेकार के बगल में है। हम नहीं जानते कि आपका ऑब्जेक्ट कैसा दिखता है, और हम नहीं जानते कि आपका कोड करता है। यदि आपके पास विशिष्ट दिमाग में है, तो यह देखने के लिए एक बेंचमार्क लिखें कि यह कंपाइलर द्वारा कैसे प्रबंधित किया जाता है।
अपने संपादित के जवाब में
मैं सामान्य सिफारिश के किसी भी प्रकार है अगर वहाँ जब यह गुजर वास्तुकला, टाइप के आकार, कैश आकार, आदि कुछ की तरह जानते हुए भी पैरामीटर के लिए आता है इच्छुक हूँ: "जब यह एन बाइट्स से छोटा होता है मूल्य द्वारा प्रकार गुजर पसंद करते हैं।
पहले, अपने संकलक पर भरोसा है। यह आक्रामक तरीके से दूर प्रतियां अनुकूलित करेंगे कई स्थितियों में, तो भले ही आप मूल्य से एक बड़ी वस्तु पारित कर , यह एक मापनीय समस्या होने की संभावना नहीं है।
दूसरा, आप एक सूक्ष्मदर्शीकरण को देख रहे हैं जो किसी भी तरह से एक उल्लेखनीय अंतर बनाने की संभावना नहीं है। छोटी वस्तुओं के लिए, मूल्य से गुजरने से एक सूचक संकेत मिलता है, इसलिए यह शायद थोड़ा तेज़ है। किसी बिंदु पर, यह प्रतिलिपि बनाने की लागत से अभिभूत हो जाता है (ऑब्जेक्ट मानते हुए कॉपी किया गया है, ऊपर देखें)। के लिए बहुत बड़ी वस्तुएं (तर्क के लिए, आइए 500 बाइट्स या उससे ऊपर कहें, इतनी बड़ी है कि सामान्यतः तक पहुंच नहीं है), आपको निश्चित रूप से संदर्भ से गुजरना चाहिए।
लेकिन 8, 16, 24, 40 बाइट्स की वस्तुओं के लिए? कौन जानता है? किसे पड़ी है? वास्तविक कोड में मापने योग्य अंतर बनाने की संभावना नहीं है।
कौन सा मुझे अंगूठे का दो नियमों की ओर जाता है:
- करना क्या प्राकृतिक लगता है: यदि प्रतिलिपि से गुज़र अपने कोड सरल या स्वच्छ बनाता है, कि है।
- यदि प्रदर्शन महत्वपूर्ण है, तो (1) सुनिश्चित करें कि वास्तव में आप जो देख रहे हैं वह है आपके प्रदर्शन पर ध्यान देने योग्य प्रभाव। इसे मापो। यदि यह प्रदर्शन को प्रभावित करता है, तो इसे मापा जा सकता है। यदि इसे मापा नहीं जा सकता है, तो प्रदर्शन में अंतर, परिभाषा के अनुसार, ध्यान देने योग्य नहीं हो सकता है।
तो, संक्षेप में:
primitve प्रकार के लिए
- , मूल्य से गुजरती हैं।
- बहुत बड़े प्रकार के लिए, संदर्भ द्वारा पास करें।
- अन्य सभी चीज़ों के लिए, चिंता करना बंद करें और अपना समय कुछ उत्पादक पर खर्च करें।
कुछ बिंदु पर, 8 बाइट से पहले, संकलक स्थानीय प्रतिलिपि बनाने के लिए कोड उत्पन्न करता है और उस प्रतिलिपि को एक पॉइंटर पास करता है। बस इसे आज़माएं, जेनरेट किए गए मशीन कोड को देखें। –