इस साधारण प्रोग्रामयह स्ट्रक्चर पैडिंग चाल क्यों काम करता है?
#include <iostream>
struct A
{
int x1234;
short x56;
char x7;
};
struct B : A
{
char x8;
};
int main()
{
std::cout << sizeof(A) << ' ' << sizeof(B) << '\n';
return 0;
}
यह प्रिंट 8 12
पर विचार करें। भले ही B
संरेखण आवश्यकताओं को तोड़ने के बिना 8 बाइट्स में पैक किया जा सकता है, इसके बजाय यह एक लालची 12 बाइट लेता है।
sizeof(B) == 8
होना अच्छा लगेगा, लेकिन Is the size of a struct required to be an exact multiple of the alignment of that struct? का उत्तर बताता है कि कोई रास्ता नहीं है।
मैं जब निम्न
struct MakePackable
{
};
struct A : MakePackable
{
int x1234;
short x56;
char x7;
};
struct B : A
{
char x8;
};
मुद्रित 8 8
इसलिए आश्चर्य हुआ।
यहां क्या हो रहा है? मुझे संदेह है कि मानक-लेआउट-प्रकारों के साथ कुछ करने के लिए कुछ है। यदि हां, तो उपर्युक्त व्यवहार के कारण इसके लिए तर्क क्या है, जब उस सुविधा का एकमात्र उद्देश्य सी के साथ बाइनरी-संगतता सुनिश्चित करना है?
संपादित करें: जैसा कि अन्य लोगों ने बताया है इस ABI या संकलक विशिष्ट है, इसलिए मैं जोड़ने के लिए है कि इस व्यवहार निम्नलिखित compilers के साथ x86_64-अज्ञात-linux-gnu पर मनाया गया चाहिए:
- बजना 3.6
- जीसीसी 5,1
मैं भी कुछ बजना के struct डम्पर से अजीब देखा है। अगर हम डेटा आकार के लिए बिना पूंछ गद्दी ("dsize"),
A B
first 8 9
second 7 8
तो पहले उदाहरण में पूछना हम dsize(A) == 8
मिलता है। यह 7 क्यों नहीं है?
शायद कंपाइलर कार्यान्वयन के विवरण के अलावा कोई तर्क नहीं है ... – deviantfan
आपको एक विशिष्ट एबीआई के बारे में पूछना होगा, क्योंकि यह व्यवहार सी ++ के दायरे में लगभग शून्य मौका है। एफडब्ल्यूआईडब्ल्यू, मुझे यह समझाने के लिए इटेनियम (एक त्वरित नज़र में) कुछ भी नहीं मिला है, हालांकि मुझे जीसीसी 5.1 के साथ '8 8' मिलता है, इसलिए ...:/ –
क्या टैग [टैग: भाषा-वकील] उपयुक्त है इस सवाल के लिए? –