c++ - Is it legal to cast float* to std::complex* -
26.4 [जटिल। अंक] कास्टिंग के बारे में यह कहता है std :: complex & lt; T & gt; 4 इसके अलावा, यदि कोई एक प्रकार की अभिव्यक्ति है तो
cv std :: complex & lt; T & gt; * से
कोड> और अभिव्यक्ति
एक [i] एक पूर्णांक अभिव्यक्ति
i के लिए अच्छी तरह से परिभाषित है, फिर:
- reinterpret_cast & lt; cv T * & gt; ( ए) [2 * i]
एक [i] का वास्तविक भाग निर्दिष्ट करेगा, और
- reinterpret_cast & lt; cv T * & gt; (ए) [2 * I + 1]
a [i] का काल्पनिक हिस्सा निर्दिष्ट करेगा।
क्या यह (या मानक के कुछ अन्य शब्द) इसका अर्थ है कि मैं दूसरी तरह से
reinterpret_cast कर सकता हूं? क्या मैं यह कर सकता हूं:
float * pf; std :: जटिल & lt; float & gt; * pc = reinterpret_cast & lt; std :: जटिल & lt; float & gt; * & gt; (पीएफ); पीसी [i] .real (); एनएम के रूप में नीचे बताया, मुझे यह सुनिश्चित करना होगा कि pf संरेखण एक std :: complex & lt; float & gt; के लिए उपयुक्त है। इसका ध्यान रखा जा सकता है।
नहीं, यह खंड ऐसी कोई गारंटी नहीं देता है।
अब, व्यवहार में, सबसे आम मुद्दा संरेखण होगा: लेकिन यह भी दुर्लभ हो सकता है।
दूसरी समस्या में सख्त अलियासिंग शामिल होगा, जहां स्मृति को double < / कोड> संकलक द्वारा ग्रहण किया जा सकता है ताकि संकेतक को अन्य प्रकारों ( char को छोड़कर) से जुड़े किसी भी आपरेशन से संशोधित नहीं किया जा सके। उपर्युक्त जगह एक अन्य तरीका (एक जटिल आवंटित संकेतक शायद मान नहीं कर सकता है डबल * s अपने डेटा के लिए नहीं इंगित करता है) जा रहा है, लेकिन आप जिस दिशा में नहीं चाहते । फिर यह अपेक्षाकृत अस्पष्ट है, लेकिन एक संकलक आपके कोड में लिखने के लिए पुन: क्रमित करने के लिए इसका उपयोग कर सकता है।
यह, हालांकि, आमतौर पर काम करेगा अधिक बार यदि आप इसे संरेखित करते हैं, और आपका कंपाइलर सख्त अलियासिंग मान्यताओं का उपयोग नहीं करता है: फिर भी यह मानक द्वारा अपरिभाषित व्यवहार है, तथापि।
Comments
Post a Comment