2011-01-23 13 views
5

नीचे इबो पर एक साधारण परीक्षण है, मैंने इसे vc9 और g ++ दोनों पर संकलित किया है। आउटपुट दोनों कंपाइलरों पर भिन्न होता है। मैं क्या जानना चाहता हूं कि वीसी का व्यवहार अनुरूप है या नहीं।खाली बेस क्लास ऑप्टिमाइज़ेशन

#include <iostream> 

class empty 
{ 
}; 

class empty_one : public empty {}; 
class empty_two : public empty {}; 

class non_empty 
    : public empty_one 
    , public empty_two 
{ 
}; 

int main() 
{ 
    std::cout << "sizeof(empty): " << sizeof(empty) << std::endl; 
    std::cout << "sizeof(empty_one): " << sizeof(empty_one) << std::endl; 
    std::cout << "sizeof(empty_two): " << sizeof(empty_two) << std::endl; 
    std::cout << "sizeof(non_empty): " << sizeof(non_empty) << std::endl; 

    std::cout << std::endl; 

    non_empty a[2]; 

    void* pe10 = static_cast<empty*>(static_cast<empty_one*>(&a[0])); 
    void* pe20 = static_cast<empty*>(static_cast<empty_two*>(&a[0])); 
    std::cout << "address of non_empty[0]: " << &a[0] << std::endl; 
    std::cout << "address of empty of empty_one: " << pe10 << std::endl; 
    std::cout << "address of empty of empty_two: " << pe20 << std::endl; 

    std::cout << std::endl; 

    void* pe11 = static_cast<empty*>(static_cast<empty_one*>(&a[1])); 
    void* pe21 = static_cast<empty*>(static_cast<empty_two*>(&a[1])); 
    std::cout << "address of non_empty[1]: " << &a[1] << std::endl; 
    std::cout << "address of empty of empty_one: " << pe11 << std::endl; 
    std::cout << "address of empty of empty_two: " << pe21 << std::endl; 
} 

कुलपति पर,

pe20 == pe11. (test1) 

दो वस्तुओं की दो उप वस्तुओं एक ही पते मिल सकता है? क्या यह अनुरूप है?

इसके अलावा,

pe20 >= &a[0] + sizeof(a[0]) (test2) 

कर सकते हैं एक उप-वस्तु का पता एक वस्तु के अंत से गुजरता है?

जी ++ पर, दो परीक्षणों से ऊपर नहीं है। में C++ 0x मानक प्रारूप, 1.8/6,

जब तक एक वस्तु एक सा मैदान या शून्य आकार का एक आधार वर्ग subobject है, उस वस्तु का पता है:

संपादित पहले बाइट का पता चलता है। दो अलग-अलग वस्तुओं है कि न तो थोड़ा-क्षेत्रों और न ही शून्य आकार के आधार वर्ग subobjects हैं अलग पतों

होगा मानक की आवश्यकता है कि दो वस्तुओं भिन्न पता है, जब वे हैं न बिट क्षेत्रों और न ही आधार शून्य आकार के वर्ग subobjects। लेकिन इसकी आवश्यकता नहीं है कि शून्य आकार के दो उप-वस्तुओं में एक ही पता नहीं हो सकता है। तो test1 सच हो सकता है?

+0

मुझे लगता है कि आप सुरक्षित रूप से इसे एमएसवीसी टीम तक ला सकते हैं (जब तक कि यह पहले से ही कोई बात नहीं है)। –

उत्तर

1

pe10 == pe11। क्या की दो उप-वस्तुओं में दो ऑब्जेक्ट्स एक ही पते हैं? यह अनुरूप है?

नहीं, दो अलग-अलग वस्तुओं में एक ही पता नहीं हो सकता है। यदि उनके पास है, तो संकलक मानक शिकायत नहीं है।

वैसे, वीसी ++ का कौन सा संस्करण आप उपयोग कर रहे हैं? मैं MSVC++ 2008 का उपयोग कर रहा हूँ, और यह उत्पादन यह है है:

alt text

मुझे लगता है, आप pe20==pe11 मतलब था? यदि ऐसा है, तो यह भी गलत, गैर मानक है। एमएसवीसी ++ 2008 कंपाइलर में बग है!

जीसीसी सही है; उत्पादन देखना अपने आप को: http://www.ideone.com/Cf2Ov


इसी विषय:

When do programmers use Empty Base Optimization (EBO)

+2

यह बहुत टूटा हुआ लगता है, क्योंकि 'pe20' और' pe11' के समान पता लग रहा है .... –

+1

मैंने अभी अपनी पोस्ट में एक टाइपो बनाया है, जहां दो परीक्षणों में pe10 pe20 होना चाहिए। डब्लूआरटी आपके आउटपुट, अब pe20 == pe11, जो नहीं होना चाहिए, है ना? – ashen

+1

@ क्रिस: मैंने देखा कि। तो मेरी पोस्ट अपडेट की गई। – Nawaz

1

PE10 == pe11। क्या दो वस्तुओं की दो उप-वस्तुओं में एक ही पता हो सकता है? क्या यह अनुरूप है?

Nopes!

एक खाली वर्ग के आकार शून्य नहीं हो सकता, क्योंकि उस मामले में एक ही कक्षा के दो वस्तुओं एक ही पते जो संभव नहीं है होने होगा।

इसी तरह दो अलग-अलग वस्तुओं की दो उप-वस्तुओं में एक ही पता नहीं हो सकता है। आपका कंपाइलर अनुरूप नहीं है। बदल दें!

+0

मेरी पोस्ट में एक टाइपो, क्षमा करें, मैंने इसे सही किया। pe10 pe20 होना चाहिए ... – ashen

+1

@Alex: फिर भी यह गलत है। छोटी गाड़ी छोटी गाड़ी कंपाइलर। –

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