2012-11-08 30 views
8

संभव डुप्लिकेट:
Aliasing `T*` with `char*` is allowed. Is it also allowed the other way around?क्या यह std :: सरणी अपरिभाषित व्यवहार का उपयोग है?

मैं अज्ञात आदिम प्रकार है, जो कोई 10 से अधिक बाइट लंबा है, इसलिए तरह के एक मूल्य धारण करने के लिए एक char की std::array रों उपयोग कर रहा हूँ:

std::array<char, 10> val; 
*reinterpret_cast<double*>(val.data()) = 6.3; 
//blah blah blah... 
double stuff = *reinterpret_cast<double*>(val.data()); 

मैंने पढ़ा है कि char * के माध्यम से पीछे और पीछे कास्टिंग नहीं है ndefined, क्योंकि संकलक char * मानता है किसी भी प्रकार का मान उपनाम कर सकता है। क्या यह तब भी काम करता है जब ऑब्जेक्ट के अंदर char एस की एक सरणी (मान मुझे क्या लगता है) में रखा गया है?

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

+0

अलग सवाल, एक ही जवाब। – Dan

+0

वही प्रश्न, अलग-अलग शब्द। ; -] – ildjarn

उत्तर

13

हां, std::array< char, 10 >double की संरेखण आवश्यकताओं को पूरा नहीं करता है ताकि reinterpret_cast यूबी को उत्तेजित कर सके।

इसके बजाय std::aligned_storage आज़माएं।

+0

संरेखण! बेशक यह ऐसा कुछ है जो मेरे लिए भी नहीं हुआ था। उस लिंक के लिए धन्यवाद, यह वही है जो मुझे चाहिए था। – Dan

0

इससे कोई फर्क नहीं पड़ता कि सरणी में निहित है।

मानक भी विचार नहीं करता है क्या कुछ चारों ओर से घेरे है (यह है कि बुनियादी है), लेकिन/char से दृश्यों के समर्थन रूपांतरण करता है।

इसे सीधे reinterpret_cast और असाइनमेंट के माध्यम से करने के लिए, आपको बफर को सही ढंग से गठबंधन करने की आवश्यकता है।

एक विकल्प memcpy का उपयोग करना है, जो संरेखण की परवाह नहीं करता है।

संबंधित मुद्दे पर, आमतौर पर बाइनरी स्तर पर जाने का अच्छा विचार नहीं है। उदाहरण के लिए, कंपाइलर का एक साधारण संस्करण परिवर्तन बाइनरी-सीरियलाइज्ड डेटा की फ़ाइल को पहुंच योग्य बना सकता है। वैसे भी ऐसा करने के लिए एक मुख्य चालक कच्चे प्रदर्शन विचार है।

+0

क्या यह मनमाने ढंग से 'char *' से 'double *' में परिवर्तित करने का समर्थन करता है? मुझे लगता है कि सूचक रूपांतरण हानिकारक हो सकता है। विभिन्न आकार के पॉइंटर्स के साथ एबीआई पर विचार करें। – Potatoswatter

+0

किस प्रकार का कंपाइलर परिवर्तन ऐसा हो सकता है? – Dan

+0

ए 'चार' पॉइंटर के पास किसी भी पॉइंटर के रूप में ठीक है, जैसा कि 'शून्य' के समान है। यदि बफर सही ढंग से गठबंधन नहीं किया गया है तो पॉइंटर रूपांतरण अनुमानित रूप से हानिकारक हो सकता है। वैसे भी डेटा प्रतिलिपि * अक्षम * हो सकती है। –

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