2012-08-02 8 views
85

यह सी language.It लिखा है जाता है कि:क्या का अर्थ है "__attribute __ ((पैक, गठबंधन (4)))"

typedef struct __attribute__((packed, aligned(4))) Ball { 
    float2 delta; 
    float2 position; 
    //float3 color; 
    float size; 
    //int arcID; 
    //float arcStr; 
} Ball_t; 
Ball_t *balls; 

कृपया मुझे बताओ कि यह का अर्थ है, और कैसे इस कीवर्ड का उपयोग करने के लिए।

+4

का उपयोग कर यह एक [ "प्रकार विशेषता"] (http है ढेर धक्का कर सकते हैं। संगठन/onlinedocs/gcc/type-Attributes.html) .. (मुझे यह Google में "सी विशेषता पैक" के साथ मिला। निश्चित रूप से अन्य कम से कम अच्छे कर सकते हैं!) –

+1

देखें [यह प्रश्न] (http: // stackoverflow। कॉम/क्यू/8568432/827263) - हालांकि 'गठबंधन (4)' के साथ आपको शायद चिंता करने की ज़रूरत नहीं है। –

उत्तर

102

विभाज्य है का जवाब देने से पहले करने के लिए गठबंधन किया जाना चाहिए, मैं विकी


डेटा संरचना संरेखण से आप कुछ डेटा देने के लिए चाहते हैं डेटा मेमोरी में डेटा व्यवस्थित और एक्सेस करने का तरीका है। इसमें दो अलग-अलग लेकिन संबंधित मुद्दे शामिल हैं: डेटा संरेखण और डेटा संरचना पैडिंग

जब कोई आधुनिक कंप्यूटर मेमोरी एड्रेस से पढ़ता है या लिखता है, तो यह शब्द के आकार के हिस्सों में ऐसा करेगा (उदाहरण के लिए 32-बिट सिस्टम पर 4 बाइट भाग)। डेटा संरेखण का मतलब है कि डेटा आकार के कुछ एकाधिक के बराबर मेमोरी ऑफसेट पर डेटा डालना, जो सीपीयू को मेमोरी को संभालने के तरीके के कारण सिस्टम के प्रदर्शन को बढ़ाता है।

डेटा संरेखित करने के लिए, यह पिछले डेटा संरचना के अंत और अगले की शुरुआत है, जो डेटा संरचना गद्दी है के बीच कुछ व्यर्थ बाइट्स सम्मिलित करने के लिए आवश्यक हो सकता है।


जीसीसी संरचना पैडिंग से बचने के लिए सुविधा प्रदान करता है। यानी कुछ मामलों में इस अर्थहीन बाइट से बचने के लिए। निम्नलिखित संरचना

typedef struct 
{ 
    char Data1; 
    int Data2; 
    unsigned short Data3; 
    char Data4; 

}sSampleStruct; 

sizeof(sSampleStruct) पर विचार 12 के बजाय संरचना गद्दी की वजह से 8. किया जाएगा। डिफ़ॉल्ट रूप से, X86 में, संरचनाओं को 4-बाइट संरेखण के लिए जोड़ा जाएगा।

typedef struct 
{ 
    char Data1; 
    //3-Bytes Added here. 
    int Data2; 
    unsigned short Data3; 
    char Data4; 
    //1-byte Added here. 

}sSampleStruct; 

हम __attribute__((packed, aligned(X))) का उपयोग विशेष रूप से (एक्स) आकार गद्दी जोर देते हैं करने के लिए कर सकते हैं। एक्स दो की शक्ति होना चाहिए।here

typedef struct 
{ 
    char Data1; 
    int Data2; 
    unsigned short Data3; 
    char Data4; 

}__attribute__((packed, aligned(1))) sSampleStruct; 

संदर्भ लें तो ऊपर निर्दिष्ट जीसीसी विशेषता संरचना गद्दी अनुमति नहीं है। तो आकार 8 बाइट होगा। //gcc.gnu:

आप सभी संरचनाओं के लिए भी ऐसा ही करना चाहते हैं, बस हम संरेखण मूल्य #pragma

#pragma pack(push, 1) 

//Structure 1 
...... 

//Structure 2 
...... 

#pragma pack(pop) 
+5

यदि स्मृति 4 बाइट हिस्सों में डेटा स्टोर करता है तो क्यों यह बिना हस्ताक्षरित शॉर्ट (2 बाइट लंबा) में 2 पैडिंग बाइट जोड़ रहा है? या कंपाइलर केवल संरचना के पहले और अंतिम सदस्यों को पैडिंग बाइट्स जोड़ें? क्या आप इसे स्पष्ट कर सकते हैं। – User

+3

@ यूसर प्लज़ इसे भी देखें। यदि आप अभी भी स्पष्ट नहीं हैं, तो कृपया सहायता के लिए आएं http://stackoverflow.com/questions/11772553/why-padding-is-not-happening-in-this-case – Jeyaram

58
  • packed मतलब है कि यह struct Ball के लिए छोटी संभव अंतरिक्ष का उपयोग करेगा - यानी यह गद्दी के बिना एक साथ खेतों रटना होगा
  • aligned का मतलब है हर struct Ball एक 4 बाइट सीमा पर शुरू हो जाएगा - किसी भी struct Ball के लिए यानी, इसका पता किया जा सकता है 4

ये किसी भी सी मानक का हिस्सा नहीं हैं, जीसीसी एक्सटेंशन हैं।

8

विशेषता packed का अर्थ है कि संकलक struct के क्षेत्रों के बीच पैडिंग नहीं जोड़ देगा। पैडिंग आमतौर पर खेतों को उनके प्राकृतिक आकार में गठबंधन करने के लिए प्रयोग किया जाता है, क्योंकि कुछ आर्किटेक्चर अनियंत्रित पहुंच के लिए जुर्माना लगाते हैं या इसे बिल्कुल अनुमति नहीं देते हैं।

aligned(4) मतलब यह है कि struct वाले पते पर से 4.

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