मैं सी ++ 14 §3.11/2 में उदाहरण का उपयोग कर रहा:जब मैंने वर्चुअल बेस से डी प्राप्त किया था तो आकार (डी) ने वीएस2015 में 8 बाइट्स क्यों बढ़ाए?
struct B { long double d; };
struct D : virtual B { char c; }
बजना, जी में नीचे दिए गए स्निपेट चल ++ और VS2015
#include <iostream>
struct B { long double d; };
struct D : /*virtual*/ B { char c; };
int main()
{
std::cout << "sizeof(long double) = " << sizeof(long double) << '\n';
std::cout << "alignof(long double) = " << alignof(long double) << '\n';
std::cout << "sizeof(B) = " << sizeof(B) << '\n';
std::cout << "alignof(B) = " << alignof(B) << '\n';
std::cout << "sizeof(D) = " << sizeof(D) << '\n';
std::cout << "alignof(D) = " << alignof(D) << '\n';
}
बाद मैं निम्नलिखित परिणाम मिल गया:
clang g++ VS2015
sizeof(long double) 16 16 8
alignof(long double) 16 16 8
sizeof(B) 16 16 8
alignof(B) 16 16 8
sizeof(D) 32 32 16
alignof(D) 16 16 8
अब, उपरोक्त कोड में struct D
की परिभाषा में virtual
uncommenting और बजना, जी ++ और VS20 के लिए फिर से कोड चलाने के बाद
clang g++ VS2015
sizeof(long double) 16 16 8
alignof(long double) 16 16 8
sizeof(B) 16 16 8
alignof(B) 16 16 8
sizeof(D) 32 32 24
alignof(D) 16 16 8
मैं ऊपर प्राप्त परिणामों के बारे में कोई संदेह नहीं है, एक ही अपवाद के साथ: 15, मैं निम्नलिखित परिणाम प्राप्त क्यों किया sizeof(D)
VS2015 में 24 16 से वृद्धि हुई है?
मुझे पता है कि यह कार्यान्वयन परिभाषित है, लेकिन आकार में इस वृद्धि के लिए उचित स्पष्टीकरण हो सकता है। यदि मैं संभव हो तो यह जानना चाहता हूं।
इन structs @NathanOliver आभासी कार्यों जरूरत नहीं है। जब आप वस्तुतः प्राप्त करते हैं तो क्या vtable बनाया जाता है? – Alex
बस कंपाइलर से आपको बताने के लिए कहें, '/ d1reportAllClassLayout' संकलन विकल्प का उपयोग करें। आप बी :: डी == 24 के लिए डी :: सी + 7 बाइट पैडिंग + 8 बाइट्स के लिए वर्चुअल बेस टेबल पॉइंटर + 1 बाइट के लिए 8 बाइट देखते हैं। पॉइंटर को गैर वर्चुअल केस में ऑप्टिमाइज़ किया गया है। –
मुझे लगता है कि यह [ब्लॉग पोस्ट] (http://lolengine.net/blog/2012/10/21/the-stolen-bytes) आपकी मदद करता है। टिप्पणी में, जंगल, जिन्होंने अतीत में एमएसवीसी कंपाइलर लिखा था, एक स्पष्टीकरण देता है। – akakatak