2015-10-07 15 views
6

नीचे दिए गए दो अनुच्छेदों को एन 4140 (बल मेरा है) से कॉपी किया गया था।मुझे लगता है कि मैं एन 4140 में §5.3.4/11 को समझ सकता हूं, लेकिन विस्तारित किए गए आवंटन समारोह की धारणा मुझे

§5.3.4/11:

एक नई अभिव्यक्ति आवंटन फ़ंक्शन को कॉल करने और उस आवंटन विस्तारित नहीं किया गया है, नई अभिव्यक्ति गुजरता के पहले तर्क के रूप में आवंटन फ़ंक्शन से अनुरोध की गई जगह की मात्रा। यह तर्क से कम ऑब्जेक्ट का आकार नहीं होगा; ऑब्जेक्ट एक सरणी है, तो यह केवल आकार से अधिक हो सकता है। char और unsigned char की सरणियों के लिए, नई अभिव्यक्ति की परिणाम और पता आवंटन समारोह से वापस लौटे बीच का अंतर किसी भी वस्तु प्रकार जिसका की कठोरतम मौलिक संरेखण आवश्यकता (3.11) का एक अभिन्न एकाधिक होगा आकार सरणी के आकार के आकार से बड़ा नहीं है। [नोट: आवंटन कार्यों भंडारण कि उचित रूप से मौलिक संरेखण के साथ किसी भी प्रकार की वस्तुओं के लिए गठबंधन किया है की ओर इशारा वापस जाने के लिए ग्रहण कर रहे हैं क्योंकि, सरणी आवंटन भूमि के ऊपर पर इस बाधा चरित्र सरणियों आवंटन की आम मुहावरा है जिसमें अन्य की वस्तुओं की अनुमति देता है प्रकार बाद में रखा जाएगा। अंत टिप्पणी]

§5.4.3/12

एक नई अभिव्यक्ति आवंटन समारोह और उस आवंटन बढ़ा दिया गया है, के लिए आकार तर्क की आवश्यकता होने पर आवंटन कॉल के लिए ऊपर उल्लिखित छोड़े गए कॉल के आकार के बराबर नहीं होगा, साथ ही विस्तारित कॉल के आकार को विस्तारित नहीं किया गया था, साथ ही कोई भी पैडिंग आवश्यक y आवंटित स्मृति के भीतर आवंटित ऑब्जेक्ट को संरेखित करने के लिए।

मैं §5.3.4/11 को समझ सकते हैं, लेकिन जैसा कि §5.4.3/12 में ऊपर कहा गया है आवंटन समारोह जो बढ़ा दिया गया है की धारणा, मेरे लिए समझ से बाहर है।

+1

इसका मूल रूप से अर्थ है कि 'आकार (वर्ग) '1000 गुना आवंटित करने के बजाय, संकलक' आकार (वर्ग) * 1000' आवंटित कर सकता है यदि/12 में उल्लिखित मानदंडों को पूरा किया जाता है। – SingerOfTheFall

उत्तर

6

यह भाषा N3664: Clarifying Memory Allocation द्वारा जोड़ा गया था जो आवंटन फ़्यूज़ आवंटन को कार्यान्वित करने की अनुमति देता है जब आवंटन देखने योग्य व्यवहार का हिस्सा नहीं होता है। दूसरे शब्दों में आवंटन बढ़ाया जा सकता है

समारोह कॉल ही बढ़ाया है नहीं लेकिन समारोह कॉल और इसलिए आवंटन हटाया जा सकता है और आवंटन पर बाद में lumped किया जा सकता है एक साथ एक बड़ा आवंटन में।

वर्तमान C और C++ मानकों के रूप में सख्त पढ़ने नेतृत्व कर सकते हैं करने के लिए एक निष्कर्ष है कि आवंटन रणनीति किसी भी जानकारी व्युत्पत्ति नहीं करने पर विचार नहीं किया जाएगा:

प्रस्ताव समस्या (जोर मेरा) में कहा गया नए के अनुक्रम से और अभिव्यक्तियों को हटाएं। संक्षेप में, मानक आवंटन के मैक्रो-ऑप्टिमाइज़ेशन को बहिष्कृत कर सकते हैं।

दूसरी ओर, मानकों का एक सख्त पढ़ा जाना एक को जन्म दे सकती निष्कर्ष है कि कार्यान्वयन प्रत्येक के लिए एक आवंटन समारोह कॉल और हर नई अभिव्यक्ति करना चाहिए। यह पठन आवंटन के सूक्ष्म अनुकूलन को बाहर कर सकता है।

और प्रस्ताव:

हम और अधिक ठीक अनिवार्य आवश्यकताओं पर ध्यान केंद्रित शब्दों के साथ मौजूदा यंत्रवत शब्दों को बदलने के लिए प्रस्ताव करते हैं। उद्देश्य व्यवहार को सक्षम करना है कि कुछ मौजूदा कंपाइलर्स और मेमोरी आवंटकों को पहले से ही है। उदाहरण के लिए, TCMalloc

देख सकते हैं और आगे कहते हैं:

कार्यान्वयन पर एक अनिवार्य आवश्यकता है कि वे प्रयोग करने योग्य मेमोरी, नहीं वे आवंटन कॉल के किसी खास अनुक्रम है कि वितरित करते हैं। हम नए अभिव्यक्तियों के संबंध में आवंटन कॉल को आराम करने का प्रस्ताव करते हैं।

  1. कुछ बाधाओं के भीतर, आवंटन कॉल की संख्या कार्यक्रम के देखने योग्य व्यवहार का हिस्सा नहीं है। यह कार्यान्वयन को से बचकर या से बचकर आवंटन कॉल की संख्या को कम करने के लिए सक्षम बनाता है।

  2. जब से बचने या आवंटन fusing, स्थान की मात्रा अनुरोध किया है कि अतिरिक्त पेडिंग की अपवाद संरेखण की कमी को पूरा करने के साथ, नए भाव से गर्भित अधिक नहीं है। यह का अर्थ है कि आवंटित स्थान की मात्रा पीक आवंटन में वृद्धि नहीं करती है। सी ++ वर्ग विशेष स्मृति allocators अक्सर विशिष्ट वर्ग के आकार को देखते रहे हैं

कारण, हम उन allocators को यह छूट लागू नहीं है।

इससे आवंटन पूरी तरह से छोड़ा जा सकता है जो कुछ मामलों में आश्चर्यजनक हो सकता है।हम निम्नलिखित उदाहरण this question से लिया के लिए देख सकते हैं:

#include <new> 

int main() 
{ 
    int* mem = new (std::nothrow) int[100]; 
    return 0; 
} 

बजना (see it live via godbolt) को यह अनुकूलन कर:

main:         # @main 
    xorl %eax, %eax 
    retq 

यह स्वीकार्य नहीं है क्योंकि कोई नमूदार व्यवहार प्रभावित है है, इसलिए इस के अंतर्गत आती है as-if rule की छतरी।

+1

मैं अभी भी आपके उदाहरण में अनुकूलन के बीच संबंध नहीं देख सकता हूं और §5.4.3/12 – Belloc

+1

@ बेलोक समझाता है कि ऑप्टिमाइज़ेशन शामिल है [मेरे द्वारा लिंक किए गए प्रश्न का मेरा जवाब] (http://stackoverflow.com/a/31877074/1708801) तर्क बताता है जो इसे अनुमति देता है। यह मूल रूप से * as-if नियम * पर आता है। एक बार जब हम आवंटन को छोड़ने की अनुमति देते हैं तो कॉल करने की इजाजत दी जाती है कि क्या यह देखने योग्य व्यवहार को प्रभावित करता है या नहीं। –

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