2011-06-15 15 views
16
typedef union epoll_data 
{ 
    void  *ptr; 
    int   fd; 
    __uint32_t u32; 
    __uint64_t u64; 
} epoll_data_t; 

यहां int और __uint32_t 4 बाइट्स हैं, जबकि अन्य 8 बाइट हैं।विभिन्न आकार के सदस्य के संघ का मेमोरी लेआउट?

जब हम fd को int पर सेट करते हैं, तो क्या यह पहले 4 बाइट्स या अंतिम 4 बाइट्स पर झूठ बोलता है, या यह अंतहीनता पर निर्भर करता है?

कुछ कारणों की सराहना की जाती है।

+1

अभ्यास में छोटे प्रकार हमेशा शुरुआत में होंगे, लेकिन मुझे यकीन नहीं है कि यह कहां या कहां लिखा गया है ... –

उत्तर

24

यह पहले 4 बाइट्स पर स्थित है। सी 99 मानक §6.7.2.1/14:

संघ का आकार अपने सदस्यों में से सबसे बड़ा रखने के लिए पर्याप्त है। सदस्यों में से किसी एक का मूल्य किसी भी समय यूनियन ऑब्जेक्ट में संग्रहीत किया जा सकता है। संघीय वस्तु के लिए एक सूचक, उपयुक्त रूप से रूपांतरित, अपने प्रत्येक सदस्यों को इंगित करता है (या यदि कोई सदस्य थोड़ा-क्षेत्र है, तो उस इकाई में जहां वह रहता है), और इसके विपरीत।

इसका तात्पर्य है कि संघ के सभी सदस्यों का पता समान है।

+0

सच नहीं है, वे पैडिंग के कारण विभिन्न स्थानों पर शुरू कर सकते हैं। नीचे दिए गए ईएलएफ मानक में चित्रा 3.5 देखें। यह एक उदाहरण है कि संघ/संरचना परिभाषा मामलों के भीतर क्षेत्रों की घोषणा का आदेश कैसे है। – user209051

+3

@ उपयोगकर्ता 209051: गलत। मान लीजिए कि चित्रा 3-6 (3-5 एक संरचना है), ध्यान दें कि बिटफील्ड को बाईं ओर दाएं और उच्च पते पर कम पते के साथ चित्रित किया गया है। पैडिंग सदस्यों के बाद होती है (उच्च पते के साथ)। –

0

यह वास्तव में उस प्लेटफॉर्म के लिए ईएलएफ-एबीआई पर निर्भर करता है। http://www.sco.com/developers/devspecs/abi386-4.pdf में धारा 3.1 के तहत दिए गए उदाहरण और आंकड़े देखें, यह दिखाता है कि संरेखण बाधाओं के कारण पैडिंग होने पर इसे कम पते पर शुरू करने की आवश्यकता नहीं है।

+1

गलत। मेरे उत्तर पर मेरी टिप्पणी देखें। ईएलएफ एबीआई सी भाषा के लिए आधिकारिक/मानक नहीं है। –

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