2011-08-18 12 views
12

संकलक पर निर्भर करता है निम्न कोड:स्वचालित संग्रहण अवधि पर सटीक आवश्यकताएं क्या हैं?

int main() 
{ 
    srand(0); 
    if(rand()) { 
     char buffer[600 * 1024] = {}; 
     printf(buffer); 
    } else { 
     char buffer[500 * 1024] = {}; 
     printf(buffer); 
    } 
    return 0; 
} 

जब अधिकतम ढेर आकार 1 मेगाबाइट के बराबर के साथ एक सिस्टम पर भाग गया या तो एक खाली स्ट्रिंग या एक ढेर अतिप्रवाह के साथ दुर्घटनाओं प्रिंट करता है।

अंतर यह है क्योंकि विभिन्न कंपाइलर्स स्वचालित संग्रहण को अलग-अलग आवंटित करते हैं। अधिकांश कंपाइलर स्टोरेज for all objects on function start आवंटित करते हैं, इसलिए ऊपर दिए गए कोड में वे 600 + 400 = 1100 किलोबाइट आवंटित करते हैं और इससे स्टैक ओवरफ़्लो होता है। कुछ कंपाइलर स्मार्ट होते हैं और वे देखते हैं कि वे दो एरे एक ही समय में कभी भी सुलभ नहीं हो सकते हैं, इसलिए वे उसी स्मृति का पुन: उपयोग करते हैं और केवल 600 किलोबाइट आवंटित करते हैं और कार्यक्रम ठीक चलता है।

अब स्टैंडर्ड (3.7/1) कि भंडारण अवधि भंडारण और उसके बाद (3.7.2/1) की न्यूनतम संभावित जीवनकाल कि इन वस्तुओं [स्वचालित अवधि के साथ] के लिए भंडारण तक रहता है परिभाषित करता है कहते हैं ब्लॉक जिसमें वे बनाए गए हैं मौजूद हैं।

मुझे समझ में नहीं आता कि कैसे 3.7/1 और 3.7.2/1 को एक साथ लागू किया जाना है। एक कहता है कि अवधि न्यूनतम क्षमता है और दूसरा स्पष्ट रूप से कहता है कि यह तब तक रहता है जब तक ब्लॉक मौजूद नहीं है। ऐसा लगता है कि पहले दोनों आवंटन रणनीतियों के अनुसार कानूनी हैं, लेकिन दूसरी मांगें कि केवल "पुन: उपयोग" आवंटन रणनीति का उपयोग किया जाता है।

3.7/1 और 3.7.2/1 सह-अस्तित्व कैसे करते हैं? क्या सबसे बुरी स्थिति (पहली रणनीति) में प्रोग्राम की जरूरतों की तुलना में अधिक स्मृति आवंटित करना कानूनी है?

+3

+1 दिलचस्प सवाल। – Sean

+5

मैंने परिभाषा के अनुसार 3.7/1 पढ़ा है "परिभाषा के अनुसार, _storage अवधि_ न्यूनतम निर्दिष्ट करता है" और 3.7.2/1 कहता है "एक स्वचालित चर के लिए भंडारण अवधि तब तक है जब संलग्न ब्लॉक निकलता है"। तो मुझे लगता है कि कोई विरोधाभास नहीं है और या तो रणनीति अनुमत है। (दरअसल, एक कचरा इकट्ठा करने वाला कार्यान्वयन जो वास्तव में ढेर पर सबकुछ रखता है, शायद स्वीकार्य है।) – Nemo

उत्तर

6

"तब तक रहता है" न्यूनतम भी है।

+0

तो क्या मैं उन दोनों को "न्यूनतम अवधि तक ब्लॉक समाप्त होने तक" पढ़ता हूं? – sharptooth

+0

सही ढंग से। ध्यान दें कि भले ही यह अन्यथा होगा, फिर भी कंस्ट्रेलर को पहले संभावित अवसर पर संग्रहण स्थान का पुन: उपयोग करने की आवश्यकता नहीं होगी। – MSalters

7

मैंने 3.7/विभिन्न स्टोरेज क्लैस (स्वचालित, स्थैतिक, गतिशील) की एक प्रारंभिक वर्णन और परिभाषा के रूप में पढ़ा है और प्रत्येक के लिए कार्यान्वयन आवश्यकता के रूप में नहीं ... automatic के लिए कार्यान्वयन आवश्यकता को 3.7.2/1।

पढ़ना 3.7.2/1 यह न करे नहीं है कि यह लंबे समय तक मौजूद है से ब्लॉक मौजूद है (कि अभी कम से कम है) - IMHO यह संभव अनुकूलन के संदर्भ में संकलक कार्यान्वयन करने वालों के लिए एक प्रारंभिक है ...

संबंधित मुद्दे