2010-05-31 12 views
9

तोड़ता है मेरे पास वर्चुअल और गैर वर्चुअल सदस्य फ़ंक्शंस द्वारा उपयोग किए जाने वाले निजी डेटा सदस्यों (उनमें से कुछ स्थिर) के साथ एक कक्षा है। कोई इनलाइन फ़ंक्शन नहीं है और कोई मित्र वर्ग नहीं है।कक्षा के निजी डेटा सदस्यों के क्रम को बदलना एबीआई

class A 
{ 
    int number; 
    string str; 
    static const int static_const_number; 
    bool b; 
public: 
    A(); 
    virtual ~A(); 
public: 
    // got virtual and non-virtual functions, working with these memebers 
    virtual void func1(); 
    void func2(); 

    // no inline functions or friends 
}; 

निजी डेटा के सदस्यों के क्रम ABI इस मामले में टूट जाता है बदल रहा है?

class A 
{ 
    string str; 
    static const int static_const_number; 
    int number; // <-- integer member moved here 
    bool b; 
    ... 
}; 


संपादित
प्रकार नहीं बदल रहे हैं, केवल सदस्यों के आदेश। कोई भी झंडे भी उपयोग नहीं किया जाता है। कोड को साझा लाइब्रेरी के रूप में उपयोग किया जाता है, इस कोड के लिए कोई स्थिर लिंक नहीं है। मैं लिनक्स पर हूं और कंपेलर जीसीसी-3.4.3 और जीसीसी-4.1

+1

ध्यान दें कि आपके मामले में, आपको एक कन्स्ट्रक्टर और विनाशक घोषित करने की आवश्यकता होगी, क्योंकि उनमें से दोनों को अन्यथा इनलाइन प्रदान की जाती है। –

+1

@ जोहान्स हां, उन्हें घोषित किया गया है, बस उन्हें विवरण में याद किया गया है। लेकिन नोट के लिए धन्यवाद, यह उपयोगी है। –

उत्तर

12

यह हो सकता है कि हां, यदि A का आकार स्थान और संख्या में भिन्नता के कारण भिन्न हो सकता है डेटा सदस्यों के बीच पैडिंग बाइट्स का।

3

सी ++ कोई एबीआई परिभाषित नहीं करता है। यहां एकमात्र सही उत्तर है "यह आपके कंपाइलर पर निर्भर करता है"। जवाब शायद हां है।

+0

यह लिनक्स –

3

यह संभवतः कहीं भी तोड़ देगा जहां आपके पास एक से अधिक बाइनरी में संकलित कार्यान्वयन हैं, क्योंकि आप अलग-अलग आदेशित निजी सदस्यों तक पहुंचने वाले कार्यों के साथ दो द्विआधारी के साथ समाप्त कर सकते हैं। इसमें वर्चुअल फ़ंक्शंस के कार्यान्वयन शामिल हैं, क्योंकि उनमें कई बाइनरी में संकलित नहीं होने वाले उनके ओवर-ओवर्रिडेन कार्यान्वयन भी हो सकते हैं।

सबसे अच्छा तरीका शुद्ध आभासी कार्यों का उपयोग करना है और इन्हें 'मेजबान' बाइनरी से इंटरफेस के रूप में बेनकाब करना है। फिर अतिरिक्त बाइनरी को कार्यान्वयन की आवश्यकता नहीं होती है, इसलिए वे हमेशा 'होस्ट' बाइनरी में कार्यान्वयन को कॉल करते हैं, जिसका मतलब असंगतता के लिए कोई जगह नहीं है।

+0

पर जीसीसी है यह एक साझा लाइब्रेरी है, मुझे लगता है कि यह केवल एक ही स्थान पर संकलित है और फिर इसे लोड करने वाली द्विआधारी में उपयोग किया जाता है। संकेत के लिए अभी भी 10x। केडीई टेकबेस लेख का हवाला देते हुए –

5

KDE Policies/Binary Compatibility Issues With C++ के अनुसार आप बाइनरी संगतता को तोड़ने के बिना ऐसा नहीं कर सकते हैं। हालांकि, जैसा कि उनके अस्वीकरण कहता है, वे "आप नहीं कर सकते ..." भाग में दी गई कुछ सलाहएं संकलक निर्भर हैं, इसलिए आप उस परिवर्तन से दूर हो सकते हैं (हालांकि यह बहुत संभव नहीं है)।

+0

+1। वेब पर एबीआई संगतता के संबंध में यह निश्चित रूप से सलाह का सबसे अच्छा संग्रह है। – andref

+0

@andref, संदेह है कि यह सबसे अच्छा है; बस सबसे ज्ञात, मुझे लगता है ;-) –

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