"__Attribute __ ((पैक, संरेखित (4)))" का क्या अर्थ है


122

यह सी भाषा है। यह लिखा है कि:

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
यह एक "प्रकार विशेषता" है .. (मैंने इसे Google में "C विशेषता पैक" के साथ पाया है। निश्चित रूप से अन्य लोग कम से कम उतना अच्छा कर सकते हैं!)

1
इस सवाल को देखें - हालाँकि आपके साथ aligned(4)शायद ज्यादा चिंता करने की ज़रूरत नहीं है।
कीथ थॉम्पसन

जवाबों:


157

जवाब देने से पहले मैं आपको विकी का कुछ डेटा देना चाहूंगा


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

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

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


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

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

}sSampleStruct;

sizeof(sSampleStruct)8 के बजाय 12 होगा। संरचना पैडिंग के कारण। डिफ़ॉल्ट रूप से, 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)))विशेष (X) आकार के पैडिंग को जोर देने के लिए उपयोग कर सकते हैं । X दो की शक्तियाँ होनी चाहिए। यहाँ देखें

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

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

इसलिए उपर्युक्त gcc विशेषता संरचना को पैडिंग की अनुमति नहीं देती है। तो आकार 8 बाइट्स होगा।

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

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)

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

5
@User Plz इसे भी देखें। यदि आप अभी भी स्पष्ट नहीं हैं, plz help stackoverflow.com/questions/11772553/… के
Jeyaram

जिस किसी ने भी कहा कि ये पेडिंग बाइट्स अर्थहीन हैं, यह नहीं जानता कि गलत डेटा एक्सेस x86 आर्किटेक्चर की विषमता है। इन बाइट्स अपवाद से बचने के लिए आवश्यक हैं जब प्रोसेसर लोड करने की कोशिश करता है - एक पूर्णांक कहते हैं - डेटा जो इसकी प्राकृतिक संरेखण सीमा को स्ट्रैडल करता है।
तनवीर बदर

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

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


17

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

aligned(4) इसका मतलब है कि संरचना को एक पते से जोड़ा जाना चाहिए जो 4 से विभाज्य है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.