2011-10-17 12 views
5

अगर मैं इस तरह की एक struct है:struct सदस्यों स्मृति लेआउट

struct S { 
    ANY_TYPE a; 
    ANY_TYPE b; 
    ANY_TYPE c; 
} s; 

मैं सुरक्षित रूप से मान सकते हैं कि निम्नलिखित अनुमान हमेशा सभी प्लेटफार्मों पर सच हो जाएगा?

((char *)&s.a) < ((char *)&s.c) 
((char *)&s.a + sizeof(s.a) + sizeof(s.b)) <= ((char *)&s.c) 

सी ++ में भी?

+0

@VJo: क्या आप समझा सकते हैं कि कैसे? –

+0

ANY_TYPE का उदाहरण क्या है जहां यह नहीं है? –

+0

आप क्यों चाहेंगे? संरचनाओं का बिंदु इस तरह की जुगलिंग से दूर होना है। – Beta

उत्तर

3

हां, कम से कम सी में। कंपाइलर किसी भी संरचना सदस्य के बाद पैडिंग डालने के लिए स्वतंत्र है लेकिन इसे सदस्यों को पुन: व्यवस्थित नहीं करना चाहिए।

इसे पहले सदस्य से पहले पैडिंग भी सम्मिलित नहीं करना चाहिए।

C99 से, 6.7.2.1:

13/ एक संरचना वस्तु के भीतर, गैर बिट क्षेत्र के सदस्यों और इकाइयों, जिसमें थोड़ा-क्षेत्रों रहते पतों इसी क्रम में वृद्धि की है, जिसमें वे घोषित कर रहे हैं एक संरचना ऑब्जेक्ट के लिए एक सूचक, उपयुक्त रूप से रूपांतरित, अपने प्रारंभिक सदस्य को इंगित करता है (या यदि वह सदस्य थोड़ा सा क्षेत्र है, फिर उस इकाई में जिसमें वह रहता है), और इसके विपरीत। एक संरचना वस्तु के भीतर अज्ञात पैडिंग हो सकती है, लेकिन इसकी शुरुआत में नहीं।

15/ संरचना या संघ के अंत में अज्ञात पैडिंग हो सकती है।

+0

पुन * इसे पहले सदस्य से पहले पैडिंग भी सम्मिलित नहीं करना चाहिए। *: इससे अधिकांश कंपाइलर गैर-अनुपालन कर सकते हैं। पहले सदस्य से पहले एक vtable जोड़ना polymorphism लागू करने के लिए एक बहुत ही आम दृष्टिकोण है। –

+5

@ डेविडहैमेन सबसे पहले, vtables सी ++ का कार्यान्वयन विवरण नहीं है, सी नहीं। दूसरा, नो-पैडिंग-पहले-सदस्य-सदस्य आवश्यकता केवल पीओडी (सादा पुराना डेटा) के लिए है। Vtables के साथ वर्ग पीओडी नहीं हैं, और इस प्रकार ए.ओ. पहले डेटा सदस्य से पहले एक vtable सूचक। – Sjoerd

1

सी ++ में आप निश्चित हो सकते हैं कि ये धारणाएं होंगी। इस तरह की संरचना में, कंपाइलर सदस्यों के आदेश को बदलने की अनुमति नहीं है।

0

हां, डिफ़ॉल्ट रूप से सी ++ कंपाइलरों को संरचना में तत्वों के चारों ओर स्थानांतरित करने की अनुमति नहीं है जो दोनों कथन को सचमुच सच बनाता है।

0
  1. हां (- Can sizeof return 0 (zero) देखने के रूप में लंबे समय के रूप में sizeof (ANY_TYPE) नहीं 0. है कुछ compilers यह जो गैर मानक है की अनुमति देते हैं,)। आप < = या बस मानक कंपाइलर मान लेंगे।

  2. हाँ

और सी ++ भी में।

सूचक तुलना केवल सरणी और structs/कक्षाओं के अंदर समझ में आता है, आम तौर पर नहीं।

4

यह एक संरचना के लिए सच है, लेकिन जैसे ही आप एक्सेस विनिर्देशकों को पेश करते हैं, सी ++ में परिवर्तन होते हैं। कंपाइलर को एक्सेस विनिर्देशकों द्वारा सीमित किए गए पूरे ब्लॉक को पुन: व्यवस्थित करने की अनुमति है।

+0

क्या वाकई सच है?मानक कहता है, कि सदस्य चर को कक्षा में सूचीबद्ध क्रम में प्रारंभ किया जाता है। मुझे लगता है कि उनके रिश्तेदार आदेश को बदला नहीं जा सकता है। – Xeo

+2

@Xeo देखें (उदाहरण के लिए) http://stackoverflow.com/questions/4883655/access-specifier-in-c/4883764#4883764 दुर्भाग्यवश इस उत्तर में कोई मानक उद्धरण नहीं है। मैं कुछ प्रदान करने की कोशिश करूंगा। प्रारंभिकरण के बारे में: प्रारंभिकरण स्मृति क्रम से स्वतंत्र है। – pmr

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