मैंने अतीत में एम्बेडेड सिस्टम के लिए परियोजनाओं पर काम किया है जहां हमने परिणामी निष्पादन योग्य के आकार को कम करने के लिए स्टैक वैरिएबल की घोषणा के आदेश को पुन: व्यवस्थित किया है। उदाहरण के लिए, अगर हम था:क्या सी संकलक स्टैक वैरिएबल को पुनर्व्यवस्थित कर सकता है?
void func()
{
char c;
int i;
short s;
...
}
हम पुन: व्यवस्थित होगा इस होना करने के लिए:
void func()
{
int i;
short s;
char c;
...
}
संरेखण के कारण
मुद्दों पहले एक परिणामस्वरूप ढेर अंतरिक्ष के 12 बाइट्स में इस्तेमाल किया जा रहा है और दूसरा एक में हुई केवल 8 बाइट्स।
क्या सी कंपेलरों के लिए यह मानक व्यवहार है या हम संकलक का केवल एक छोटा सा उपयोग कर रहे हैं?
ऐसा लगता है कि एक कंपाइलर छोटे निष्पादन योग्य आकार के पक्ष में स्टैक वैरिएबल को पुन: व्यवस्थित करने में सक्षम होना चाहिए यदि वह चाहता था। मुझे यह सुझाव दिया गया है कि सी मानक के कुछ पहलू इसे रोकते हैं, लेकिन मैं किसी भी तरह से सम्मानित स्रोत नहीं ढूंढ पाया।
बोनस प्रश्न के रूप में, क्या यह सी ++ कंपाइलर्स पर भी लागू होता है?
संपादित
जवाब है हां, C/C++ compilers ढेर चर पुनर्व्यवस्थित कर सकते हैं, तो आप एक संकलक निश्चित रूप से यह करता है कि का एक उदाहरण दे सकते हैं है? मैं संकलक दस्तावेज या कुछ ऐसा ही देखना चाहता हूं जो इसका बैक अप लेता है।
संपादित करें फिर
धन्यवाद आपकी मदद के लिए हर कोई। दस्तावेज़ीकरण के लिए, सबसे अच्छी बात मुझे लगता है कर लिया है कागज Optimal Stack Slot Assignment in GCC (पीडीएफ), नवीन शर्मा और संजीव कुमार गुप्ता, जो सवाल में 2003 में
परियोजना जीसीसी शिखर सम्मेलन की कार्यवाही में प्रस्तुत किया गया था यहाँ था के द्वारा होता है एआरएम विकास के लिए एडीएस कंपाइलर का उपयोग करना। उस कंपाइलर के लिए प्रलेखन में इसका उल्लेख किया गया है कि मैंने दिखाए गए घोषणाओं को ऑर्डर करने के लिए प्रदर्शन में सुधार कर सकते हैं, साथ ही स्टैक आकार, एआरएम-थंब आर्किटेक्चर स्थानीय स्टैक फ्रेम में पते की गणना कैसे करता है। उस कंपाइलर ने इसका लाभ उठाने के लिए स्थानीय लोगों को स्वचालित रूप से पुनर्व्यवस्थित नहीं किया था। यहां जुड़े पेपर का कहना है कि 2003 के जीसीसी ने एआरएम-थंब प्रोसेसर के संदर्भ के इलाके में सुधार के लिए स्टैक फ्रेम को पुनर्व्यवस्थित नहीं किया था, लेकिन इसका तात्पर्य है कि आप कर सकते हैं।
मुझे कुछ भी नहीं मिला जो निश्चित रूप से कहता है कि यह कभी भी जीसीसी में लागू किया गया था, लेकिन मुझे लगता है कि यह पेपर प्रमाण के रूप में गिना जाता है कि आप सभी सही हैं। एक बार फिर धन्यवाद।
यह वास्तव में एक अच्छा बिंदु है। मैं इसके बारे में तब नहीं था जब मैं अपने सहकर्मी के साथ चर्चा कर रहा था। –
यह एक ही रजिस्टर या स्टैक स्थान पर एकाधिक चर निर्दिष्ट भी कर सकता है यदि यह साबित कर सकता है कि चर के कोड के समान भाग में चर कभी जीवित नहीं होते हैं। यह सामान्य अभ्यास है, विशेष रूप से इनलाइन कोड के साथ जो कम परिवर्तनीय जीवन की ओर जाता है। –