2016-08-06 17 views
36

यह मानना ​​उचित लगता है कि T और const T दो प्रकार होंगे जो एक ही आकार के होंगे और एक ही होगा संरेखण, लेकिन कुछ वास्तविक प्रणालियों के बारे में सोचने के बाद, ऐसा लगता है कि वे अलग हो सकते हैं।आकार (टी) == आकार (कॉन्स टी) और alignof (टी) == alignof (कॉन्स टी)

मुझे स्पष्ट करने दें:

मान लीजिए आप स्मृति के दो प्रकार के साथ एक प्रणाली है: राम और फ्लैश (जो केवल पढ़ने के लिए है)। रैम 8 बिट एड्रेसेबल है, जबकि फ्लैश केवल 16 बिट एड्रेसेबल है। मान लीजिए इस T है:

struct T 
{ 
    uint8_t x; 
    uint16_t y; 
}; 

बाइट पता रैम इस struct 3 बाइट्स लंबा हो जाएगा में .... लेकिन डबल बाइट पता फ्लैश (जहाँ एक const चर रहते हैं) में इस struct करने के लिए होगा संरेखण के मुद्दों के कारण कम से कम 4 बाइट लंबा हो।

++ मानकों आकार और const के संरेखण और गैर const प्रकार की गारंटी सी और सी कार्य करें:

तो यहाँ मेरे सवाल है?

+0

आप बहुत सारी धारणाएं कर रहे हैं जिनकी गारंटी किसी के द्वारा नहीं की जाती है।रैम बनाम अधिकांश चीजें वैसे भी आपकी लिंकर स्क्रिप्ट से आती हैं। –

+10

@ जोनाथन रेनहार्ट इसलिए प्रश्न – DarthRubik

+3

यह सवाल मुश्किल है। जवाब है "हां, उन्हें एक ही आकार होना चाहिए," हालांकि, फ़्लैश ** ** ** नहीं है "जहां 'कॉन्स्ट वेरिएबल रहता है'। हो सकता है कि आप वहां बहुत सारे कॉन्स वैल्यू डाल सकें, लेकिन कॉन्स्ट नहीं करता है मतलब फ्लैश। विशेष रूप से, मेरे पास फ़ंक्शन कॉल के लिए 'कॉन्स्ट int' तर्क हो सकता है, जो स्टैक पर होगा, फ्लैश में नहीं। अंत में, मुझे विश्वास है कि ऐसी प्रणाली सी मेमोरी मॉडल का उल्लंघन करती है, जो समरूप है, तो इसका व्यवहार एक कंपाइलर एक्सटेंशन होगा। –

उत्तर

33

धारा 3.9.3:

एक प्रकार की सीवी योग्य या सीवी-अयोग्य संस्करणों अलग प्रकार के होते हैं; हालांकि, उनके पास समान प्रतिनिधित्व और संरेखण आवश्यकताएं (3.11) होगी। 53

"सीवी-योग्य" यहां const और volatile को संदर्भित करता है। तो उत्तर हां है।

const और volatile केवल निर्दिष्ट ऑब्जेक्ट तक पहुंच की सीमाओं/विशेषताओं को निर्दिष्ट करें। उन्हें मूल प्रकार का हिस्सा नहीं माना जाता है; इसलिए वे प्रकार के गुणों को प्रभावित नहीं कर सकते हैं।

+1

तो मेरे उदाहरण में 'आकार (टी)' को मिलान करने के लिए 4 को मजबूर किया जाएगा 'कॉन्स टी '? – DarthRubik

+0

हां। सकारात्मक। इसे ऐसा बनाओ। आदि ... –

+0

और सी के लिए 6.2.5/26 (सी 11 में) वर्तनी को छोड़कर '_Alignof' –

31

हाँ, यह द्वारा [basic.type.qualifier]/1

एक प्रकार की सीवी योग्य या सीवी-अयोग्य संस्करणों अलग प्रकार के होते हैं गारंटी है; हालांकि, उनके पास समान प्रतिनिधित्व और संरेखण आवश्यकताओं (3.11) होंगे।

3

बाइट पता रैम इस struct 3 बाइट्स लंबा हो जाएगा में .... लेकिन डबल बाइट पता फ्लैश (जहाँ एक स्थिरांक चर रहते हैं) इस struct कम से कम 4 होना चाहिए था में संरेखण के मुद्दों के कारण लंबे बाइट्स, ।

हालांकि, संकलक अनुमान है कि सिर्फ इसलिए कि इसे यहाँ const है, यह रोम में संग्रहित है नहीं कर सकते। ऐसी कई अन्य चीजें हैं जो mutable की तरह इसे रोक सकती हैं, या आप केवल const T को स्टैक पर गतिशील रूप से रख सकते हैं या मैन्युअल रूप से इसे रैम या हजार अन्य चीज़ों में ढेर मेमोरी में रख सकते हैं। आपके पास const T& भी हो सकता है जो किसी भी स्थान पर हो सकता है।

+0

यह अच्छी जानकारी है। यह याद रखना अच्छा है कि 'const' रोम/फ्लैश में _guarantee_ प्लेसमेंट नहीं है, हालांकि यह वही है जो आप चाहते हैं। – pipe

+0

अच्छी तरह से 'mutable' एक' const' ऑब्जेक्ट के अंदर एक उत्परिवर्तनीय फ़ील्ड के रूप में प्रासंगिक है संशोधित किया जा सकता है और इस प्रकार रोम में नहीं रह सकता है। – Phil1970

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