नीचे इबो पर एक साधारण परीक्षण है, मैंने इसे 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 सच हो सकता है?
मुझे लगता है कि आप सुरक्षित रूप से इसे एमएसवीसी टीम तक ला सकते हैं (जब तक कि यह पहले से ही कोई बात नहीं है)। –