2012-03-07 12 views
6

मैं सिर्फ mode_t के बारे में पढ़ा है कि यह मूल रूप से निम्नलिखित जानकारी संग्रहीत करता है: फ़ाइल प्रकार (S_IFREG, S_IFDIR, S_IFCHR, S_ISBLK, S_ISFIFO, S_ISLINK, S_ISSOCK) मोड_ट 4 बाइट का उपयोग क्यों करता है?

  • 3 * के लिए

    • 7 बूलियन मूल्यों एक्सेस permissons के लिए 3 = 9 बूलियन मान (मालिक, समूह और अन्य के लिए पढ़ें, लिखें और निष्पादित करें)

    इसलिए इसे 16 बिट = 2 बाइट की आवश्यकता है। मुझे लगता है कि आप फ़ाइल प्रकार के लिए भी थोड़ा कम हो सकते हैं, क्योंकि यह या तो एक नियमित फ़ाइल, एक निर्देशिका, एक चरित्र या ब्लॉक डिवाइस, एक सॉकेट, एक प्रतीकात्मक लिंक, या एक पाइप होना चाहिए। या अन्य फाइल प्रकार मौजूद हैं?

    तो मैं सिर्फ

    printf("Size: %d byte\n", sizeof(mode_t)); 
    

    साथ mode_t के आकार की जाँच की यह 4 बाइट का उपयोग करता है। यह 4 बाइट का उपयोग क्यों करता है? क्या कोई अतिरिक्त जानकारी है जिसे मैंने नोटिस नहीं किया है?

    संपादित करें: मैं सिर्फ पाया है कि mode_t ptypes.inc में परिभाषित किया गया है:

    type mode_t = cuint32; 
    

    cuint32 एक 32 बिट आकार है, अहस्ताक्षरित पूर्णांक और ctypes.inc में परिभाषित:

    type cuint32 = LongWord; 
    

    शायद यह उत्तर के लिए मदद करता है।

  • +1

    क्या होगा अगर भविष्य में अधिक विकल्प/झंडे इत्यादि जोड़े जाएंगे? – Nim

    +0

    यह हो सकता है कि यह केवल 'int' से टाइप किया गया हो, जो अधिकांश आर्किटेक्चर में 32 बिट्स है। या यह बड़ा हो गया है ताकि यह भविष्य के झंडे को फिट कर सके। –

    +0

    आपका ** int ** टाइप _may_ 4 बाइट्स हो, भले ही आप इसे "255" संख्या में संग्रहीत करते हैं ... "बिल्डिंग ब्लॉक" प्रोसेसर आर्किटेक्चर है और इसके अलावा आपके पास किसी अन्य ध्वज के लिए कुछ खाली स्थान है जरुरत। ओएमजी मैं बिटफ्लैग से नफरत करता हूं !!! –

    उत्तर

    9

    की जब निम्न कोड दिया एक "गूंगा" संकलक क्या करेंगे पर नजर डालते हैं:

    #include <stdio.h> 
    #include <stdint.h> 
    
    int main(int argc, char **argv) { 
        uint16_t test1 = 0x1122; 
        uint32_t test2 = 0x11223344; 
        if (test1 & 0x0100) 
        printf("yay1.\n"); 
        if (test2 & 0x00010000) 
        printf("yay2.\n"); 
    } 
    

    इस प्रकार mode_t के मूल्यों के लिए एक संभावना उपयोग के मामले की तरह लगता है, अगर एक ध्वज सेट है की जाँच। अब हम यह gcc -O0 साथ संकलन और उत्पन्न विधानसभा की जाँच करें:

    0000000000000000 <main>: 
          ... 
        f: 66 c7 45 fe 22 11  movw $0x1122,-0x2(%rbp) 
        15: c7 45 f8 44 33 22 11 movl $0x11223344,-0x8(%rbp) 
        1c: 0f b7 45 fe    movzwl -0x2(%rbp),%eax ; load test1 into %eax 
        20: 25 00 01 00 00   and $0x100,%eax 
        25: 85 c0     test %eax,%eax 
          ... 
        33: 8b 45 f8    mov -0x8(%rbp),%eax ; load test2 into %eax 
        36: 25 00 00 01 00   and $0x10000,%eax 
        3b: 85 c0     test %eax,%eax 
          ... 
    

    देखें कि कैसे विशेष movzwl अनुदेश 16-बिट मूल्य लोड करने के लिए आवश्यक है? ऐसा इसलिए है क्योंकि पंजीकरण में फिट होने के लिए इसे दो अतिरिक्त बाइट्स पर साइन-विस्तारित करने की आवश्यकता है। जाहिर है यह निर्देश एक साधारण mov से अधिक जटिल है। इसका प्रदर्शन पर एक छोटा सा प्रभाव हो सकता है, और यह कुछ बाइट्स द्वारा निष्पादन योग्य आकार को बढ़ा सकता है, जो स्वयं ही बहुत खराब नहीं होगा।

    हालांकि, अगर हम मानते हैं कि 16-बिट मान का उपयोग करने में कोई फायदा नहीं होगा, क्योंकि यह आमतौर पर संरेखण के कारण 32 बिट स्टोरेज लेता है, यह स्पष्ट है कि डिजाइनर देशी शब्द आकार का उपयोग क्यों करते हैं यहां सीपीयू का।

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