8

मैं जानना चाहता हूं कि किसी प्रकार की संरचना में एक से अधिक आदिम हैं, लेकिन इसका कुल आकार एक सीपीयू रजिस्टर के आकार से कम या बराबर है, जैसे कि 4-बाइट रजिस्टर, क्या यह कभी भी एक कंपाइलर के लिए समझ में आता है इसे 4-बाइट रजिस्टरों में से एक में रखें जब इसे कैलिली स्टैक पर इसकी प्रतिलिपि बनाने या उसके लिए एक पॉइंटर पास करने के बजाय किसी फ़ंक्शन के मूल्य या संदर्भ द्वारा पारित किया जाए और सामान्य रूप से किसी एक से अधिक आदिम को पारित करते समय एक सरणी या संरचना की तरह काम एक सीपीयू रजिस्टर में गुजर रहा है कभी काम में आते हैं?क्या यह किसी संकलक के लिए एक सीपीयू रजिस्टर में इस तरह की संरचना को पास करने के लिए कभी समझ में आता है?

ऐसी संरचना का नमूना:

struct sample{ 
public: 
    char char1; 
    char char2; 
}; 

एक समारोह के लिए संरचना में उत्तीर्ण होने की नमूना:

void someFunc(const sample input){ 
//whatever 
} 
void someFunc(sample input){ 
//whatever 
} 
void someFunc(sample & input){ 
//whatever 
} 
void someFunc(const sample & input){ 
//whatever 
} 
+5

आप एक वाक्य के उस टैपवार्म को तोड़ना चाहेंगे। मुझे इसे पचाने में बहुत मुश्किल समय है। – sbi

उत्तर

4

हां। कई कंपाइलर्स के पास एक विशेष कीवर्ड या प्रकार विशेषता होती है जिसका उपयोग आप यह निर्दिष्ट करने के लिए कर सकते हैं कि संरचना को ढेर के बजाय रजिस्टरों में पारित किया जाना चाहिए। प्रोसेसर पर यह अधिक आम है जिसमें पावरपीसी की तरह कई रजिस्ट्रार और गहरी पाइपलाइन हैं, और आर्किटेक्चर में जबरदस्त प्रदर्शन सुधार हो सकता है जहां स्मृति के लिए मूल्य लिखना और फिर इसे फिर से पढ़ना एक पाइपलाइन स्टॉल का कारण बनता है।

आमतौर पर आप केवल उस संरचना के लिए उपयोग करेंगे जो मूल रजिस्टर के समान आकार है। विशेष रूप से, यह उन प्रोसेसर पर उपयोगी होता है जिनमें व्यापक सिम रजिस्ट्रार होते हैं, जो एक समय या उससे अधिक समय में 16 बाइट पास कर सकते हैं। इससे आपको एक रजिस्टर पर एक 4 आयामी वेक्टर (चार फ्लोट) (उदाहरण के लिए) पास करने दिया जाएगा। AMD's System V एक x86 एबीआई का एक उदाहरण है जो इसे अनुमति देता है।

एक अलग उदाहरण जीसीसी की डी 64_बी प्रकार विशेषता है, जो स्टैक के बजाए संभवतः रजिस्ट्रारों पर संरचना को पास करने के लिए पावरपीसी को बताता है। (यह Darwin ABI का हिस्सा है)।

typedef struct { 
    int   a; 
    float  f; 
    char   c; 
} __attribute__ ((d64_abi)) Thingy; 

Thingy foo(Thingy t); 

ऊपर मामले में, फू के लिए एक कॉल, एक नाव रजिस्टर और दो पूर्णांक रजिस्टरों पर thingy पास होता बल्कि ढेर करने के लिए इसे लिखने और सही वापस फिर से इसे पढ़ने से।वापसी मूल्य उसी तरह रजिस्टरों पर वापस आता है।

मैंने कभी ऐसा कंपाइलर नहीं देखा है जो इसे बिना बताए स्वचालित रूप से करता है, लेकिन यह संभव है कि कोई अस्तित्व में है।

+0

@Crashworks_but एक ही int रजिस्टर में दो वर्ण डालने पर व्यर्थ सही है? – Pooria

+0

@ पूरिया: बिल्कुल नहीं - यह फ़ंक्शन कॉल के दौरान स्टैक पर दो राउंड-ट्रिप बनाने से कहीं अधिक तेज़ हो सकता है। – Crashworks

+0

@Crashworks_ मेरा मतलब है कि अंतिम इरादा मेरे प्रश्न में संरचना में उन दो बाइट्स पर कुछ संचालन करना है, इसलिए वे अलग-अलग रजिस्टरों में रहना चाहिए और यदि वे एक इंट रजिस्टर में रह रहे हैं तो उन्हें ऑपरेशन करने के लिए बाद में अलग किया जाना चाहिए उनमें से प्रत्येक पर। – Pooria

3

कुछ आर्किटेक्चर पर (i386 की तरह, मैं जानता हूँ कि यह प्राचीन है, लेकिन वह क्या मैं बड़ा हुआ के साथ;) यह निश्चित रूप से इसे एक रजिस्टर में पास करने के लिए समझ में आता है, क्योंकि स्टैक से धक्का और पॉपिंग करना बहुत अधिक होता है (3-6 गुना अधिक के बीच कहें) सीपीयू चक्र पंजीकरण द्वारा गुजरने के रूप में। तो एक संकलक इसके लिए अनुकूलन करने के लिए एक अच्छा काम करेगा।

मैं कल्पना कर सकता हूं कि अन्य आर्किटेक्चर हैं जहां इससे कोई फर्क नहीं पड़ता। या यदि रजिस्ट्रार अन्य अनुकूलन के लिए उपयोग में हैं जो अधिक सुधार प्राप्त करते हैं, तो इसका उपयोग करने के लिए उन्हें समझ में नहीं आता है।

आप किस वास्तुकला का उपयोग/लक्ष्यीकरण कर रहे हैं, या आप सामान्य रूप से पूछ रहे हैं?

+0

@littlegreen_ सामान्य में। – Pooria

5

यह आपके निष्पादन वातावरण के एप्लिकेशन बाइनरी इंटरफ़ेस (एबीआई) में परिभाषित किया गया है। जब मानक को फ़ंक्शन कहा जाता है तो मानक प्रोसेसर रजिस्टरों के बारे में कुछ नहीं कहता है, इसलिए एक ऐसा वातावरण बनाना कानूनी है जहां छोटे प्रोक्लर्स को एक प्रोसेसर रजिस्टर में पैक किया जाता है।

संदर्भ भाग के लिए, वे पॉइंटर्स के रूप में पारित होने की संभावना है, क्योंकि जब कॉल किए गए फ़ंक्शन के अंदर संदर्भ का पता लिया जाता है, तो इसे संदर्भित ऑब्जेक्ट के पते पर हल करना होगा।

1

मुझे लगता है कि ऐसे कंपाइलर्स हैं जो रजिस्टरों में पीओडी पास करेंगे, भले ही वे struct एस हों।

+0

मेरी इच्छा है कि मुझे पता था कि वे कौन थे! – Crashworks

+0

@ क्रैशवर्क: असल में, मैं यह करने के लिए सभी मुख्यधारा के कंपाइलर्स (वीसी, जीसीसी) की अपेक्षा करता हूं। – sbi

+0

इतना नहीं, मुझे डर है। उदाहरण के लिए, एमएसवीसी http://codepad.org/oJoKVbJb को http://codepad.org/PV7vpM8O में बदल देता है: यह "पूर्ण अनुकूलन" पर भी, प्रत्येक चार्ट को अलग-अलग ढेर पर धक्का देकर दो-चार संरचना को पास करता है। यह बेहतर होता है जब फू() और बार() दोनों एक ही संकलन इकाई में स्थिर होते हैं और यह कॉलिंग सम्मेलन को अनदेखा कर सकता है। – Crashworks