c++ - sizeof std::aligned_storage the actual available storage size? -


क्या मानक किसी तरह गारंटी देता है कि sizeof (typename aligned_storage & lt; ... & gt; :: प्रकार) क्या डेटा के वास्तविक उपलब्ध आकार हैं जो संरेखित भंडार में उस पते पर शुरू हो सकता है? मैं यह पूछने का कारण यह है कि मैं एक स्टडी :: फ़ंक्शन शैली ऑब्जेक्ट लागू कर रहा हूं जो ऑपेट को ढेर करने से बचाता है यदि ऑब्जेक्ट कुछ छोटे संरेखित स्टोस्ट में फिट हो।

मैंने std :: function constructors के libc ++ कार्यान्वयन को देखा (जो केवल ऐसा करते हैं), और यह सुनिश्चित करने के लिए वे परीक्षण करते हैं कि पारित प्रकार संरेखित संग्रहण में फिट होगा बस ...

  यदि (sizeof (_FF) & lt; = sizeof ( __buf_) & amp; is_nothrow_copy_constructible & lt; _Fp & gt; :: मान) {__f_ = (__base *) & amp; __ buf_; :: नया (__f_) _FF (_VSTD :: चाल (__ एफ)); }  

जहां __ buf _ aligned_storage है, _FF उस प्रकार के लिए आवरण वर्ग है जिसे पारित किए गए फ़ैक्टोकर, और _Fp यही मकसद है।

मैं मानता हूं कि यह गारंटी नहीं है, और यह (शायद?) सिर्फ एलसीबी ++ के कार्यान्वयन के परिणामस्वरूप होता है aligned_storage।

std :: aligned_storage & lt; len, align & gt; :: प्रकार एक पीओडी प्रकार है। इसका मतलब यह है कि यह सादे पुराना डेटा है।

यह कैसे हुआ, इससे कोई फर्क नहीं पड़ा। यह केवल सादे पुराने डेटा है।

अब, इसमें अतिरिक्त गारंटी है यह संरेखण आवश्यकताओं align के साथ आकार के ऑब्जेक्ट के लिए गठबंधन भंडारण के लिए इस्तेमाल किया जा सकता है, लेकिन उन अतिरिक्त आवश्यकताओं को सादे पुराने डेटा के रूप में अपनी गारंटी को कम नहीं करते हैं।

और सादे पुराना डेटा यही है: सादे पुराने डेटा।

एक पीओडी प्रकार को एक सरणी में कॉपी किया जा सकता है, और एक सरणी से प्रतिलिपि किया जा सकता है, और उसके बाद उसके पास "समान स्थिति" । ऐसी प्रतिलिपि में इसका पूर्ण आकार हो सकता है ( [basic.types] 3.9 / 2)।

सिद्धांत में, मुझे संदेह है कि असाइनमेंट / प्रतिलिपि पीओडी में हर बाइट की प्रतिलिपि नहीं हो सकती, लेकिन ऐसा करने से सुरक्षित है।

मुझे लगता है कि आप एक ऐसा प्रकार हो सकता है जो किसी प्रकार की मुखौटे वाली स्मृति का प्रतिनिधित्व करता है ताकि memcpy कुछ बाइट को पारदर्शी रूप से अनदेखा कर देता है, और जैसा कि प्रकार का मान केवल कुछ बाइट्स द्वारा ही आयोजित किया जाता है, लेकिन दूसरों को अनदेखा बाइट्स नहीं हैं 3.9 से गारंटियों की समस्या है, लेकिन ये दोनों संदिग्ध है और ये किसी भी संकलक द्वारा उपयोग किए जाने वाले कार्यान्वयन के बारे में सोच सकता था।


Comments