मैं संरचनाओं के साथ काम कर रहा हूं और उनके बारे में कई प्रश्न हैं। जैसा कि मैं समझता हूं संरचना संरचना को क्रमशः स्मृति में रखा जाएगा। ब्लॉक (शब्द) की लंबाई मशीन आर्किटेक्चर (32 बिट - 4 बाइट, 64 बिट - 8 बाइट्स) पर निर्भर करती है।सी: डेटा संरचना संरेखण
चलें कहते हैं कि हम 2 डेटा संरचनाओं है:
struct ST1 {
char c1;
short s;
char c2;
double d;
int i;
};
स्मृति में यह हो जाएगा:
32 bit - 20 bytes
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
------------------------------------------------------------------------------------------
c1| PB| s | s | c1| PB| PB| PB| d | d | d | d | d | d | d | d | i | i | i | i |
64 bit - 24 bytes | 20 | 21 | 22 | 23 |
previous sequence + ---------------------
| PB | PB | PB | PB |
लेकिन हम यह पुनर्व्यवस्थित कर सकते हैं, मशीन शब्द में इस डेटा फिट बनाने के लिए। इस तरह:
struct ST2 {
double d;
int i;
short s;
char c1;
char c2;
};
दोनों 32 और 64 बिट यह उसी तरह से प्रतिनिधित्व किया जाएगा के लिए इस मामले में (16 बाइट्स):
-
:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
----------------------------------------------------------------------
d | d | d | d | d | d | d | d | i | i | i | i | s | s | ch1| ch2|
मैं सवालों की एक जोड़ी
struct
के लिए मुख्य नियम शुरुआत में बड़े आकार वाले चर को परिभाषित करना है?char str[] = "Hello";
की तरह?struct ST3 { char c1; char c2; char c3;} st3;
size = 3
है, मैं समझता हूं कि यदि हम किसी अन्य सदस्य के साथ सदस्य जोड़ देंगे, तो इसे गठबंधन किया जाएगा। लेकिन यह इससे पहले गठबंधन क्यों नहीं है?
प्रतीक्षा करें, क्या? 'पैक' का उपयोग करके पैडिंग से छुटकारा पड़ेगा, संभावित रूप से सदस्यों को * सही * गठबंधन करने के लिए मजबूर नहीं किया जा सकता है, जिनके प्रभाव x86 पर भी प्रभाव डालते हैं (उदाहरण के लिए 'डबल' तक पहुंच केवल तभी परमाणु है जब यह सही ढंग से गठबंधन हो) – Christoph
क्रिस्टोफ कहता है, यह उत्तर पूर्ण गलत जानकारी है। – Casey