2012-03-18 12 views
8

std::array<std::array<T,N>, M> में डेटा सम्मिलित होने की गारंटी है? उदाहरण के लिए:क्या नेस्टेड std :: arrays में डेटा संगत होने की गारंटी है?

#include <array> 
#include <cassert> 

int main() 
{ 
    enum {M=4, N=7}; 
    typedef std::array<char,N> Row; 
    typedef std::array<Row, M> Matrix; 
    Matrix a; 
    a[1][0] = 42; 
    const char* data = a[0].data(); 

    /* 8th element of 1D data array should be the same as 
     1st element of second row. */ 
    assert(data[7] == 42); 
} 

क्या जोर से सफल होने की गारंटी है? या, इसे एक और तरीका रखने के लिए, क्या मैं के अंत में कोई पैडिंग नहीं कर सकता हूं?

संपादित करें: बस स्पष्ट होना, इस उदाहरण के लिए, मैं पूरे मैट्रिक्स का डेटा सन्निहित होना चाहता हूँ।

+0

भले ही भंडारण संगत हो, मुझे विश्वास है कि आप एलियासिंग नियमों का सामना कर रहे होंगे। इस सवाल को मैंने कई चांदों से पहले पूछा (सी के बारे में, स्वीकार्य रूप से): http://stackoverflow.com/questions/6290956/one-dimensional-access-to-a-multidimensional-array-well-defined-c। –

+0

संभावित डुप्लिकेट [क्या एसडीडी :: सरणी में स्मृति शामिल है?] (Http://stackoverflow.com/questions/6632915/is-the-memory-in-stdarray-contiguous) रिकर्सन –

+2

@ लाइटनेसरेसेसिन ऑर्बिट: नहीं, मैं ऐसा नहीं लगता कि यह एक डुप्लिकेट है। जबकि एक 'std :: array' में डेटा संगत है, यह इस बात का तात्पर्य नहीं है कि नेस्टेड 'std :: सरणी में डेटा का पूरा सेट संगत है। या कम से कम यह मेरे जैसे गैर-भाषा वकील के लिए स्पष्ट नहीं है। –

उत्तर

10

नहीं, इस मामले में संगतता की गारंटी नहीं है।

std::array एक समग्र होने की गारंटी है, और इस तरह से निर्दिष्ट किया गया है कि भंडारण के लिए उपयोग की जाने वाली अंतर्निहित सरणी प्रकार का पहला डेटा सदस्य होना चाहिए।

हालांकि, sizeof(array<T, N>) == sizeof(T) * N की कोई आवश्यकता नहीं है, और न ही कोई आवश्यकता है कि ऑब्जेक्ट के अंत में कोई अज्ञात पैडिंग बाइट नहीं है या std::array में अंतर्निहित सरणी संग्रहण के अलावा कोई डेटा सदस्य नहीं है। (हालांकि, एक कार्यान्वयन जिसमें अतिरिक्त डेटा सदस्यों को शामिल किया गया था, सबसे अच्छा, असामान्य होगा।)

5

वे बहुत ही संगत हैं। यदि वे नहीं हैं, तो संकलक सक्रिय रूप से वहां आपसे लड़ रहा है। इस बात की कोई गारंटी नहीं है कि यह पैडिंग सम्मिलित नहीं करेगा लेकिन इसके लिए शायद ही कोई कारण नहीं है।

क्या जोर से सफल होने की गारंटी है?

data[7] एक आउट-ऑफ-बाउंड एक्सेस (अपरिभाषित व्यवहार) है। आंतरिक सरणी वस्तु में केवल सात तत्व होते हैं, इसलिए अनुक्रमणिका 7 मान्य नहीं है।

+0

हम्म, आपका उत्तर थोड़ा विरोधाभासी लगता है (या मैं बहुत घना हूं)। यदि डेटा संगत है, तो डेटा [7] 'दूसरी पंक्ति के पहले तत्व को इंगित नहीं करेगा? –

+0

@ सोचने में दोष उत्पन्न करें "1 डी डेटा सरणी का 8 वां तत्व दूसरी पंक्ति के पहले तत्व के समान होना चाहिए।" अनदेखा कर रहा है कि उस कोड में कोई सरणी 8 वां तत्व नहीं है। इस बात की कोई गारंटी नहीं है कि इसके कारण डेटा [7] 'क्या करेगा।प्रैक्टिस में, हां, मुझे संदेह है कि यह दूसरी पंक्ति के पहले तत्व को इंगित करेगा, लेकिन जैसा कि यह हमेशा यूबी के साथ होता है, * आप सुरक्षित रूप से उस पर भरोसा नहीं कर सकते *। –

+0

ठीक है, तो मैं यह कहता हूं कि "* वे बहुत ही संगत * हैं" का अर्थ यह है कि ** प्रत्येक आंतरिक सरणी ** में डेटा संगत है। क्या यही आपका मतलब है? –

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