2012-09-06 13 views
6
gcc (GCC) 4.7.0 
c89 
x86_64 

हैलो,__attribute __ (__ packed__) का उपयोग करके गद्देदार संरचनाएं, क्या यह वास्तव में इसके लायक है?

मैं सोच रहा हूँ कि यह __attribute__ ((__packed__)) ढांचे पर का उपयोग कर का उपयोग कर के लायक है। ऐसा लगता है कि इसके साथ संरचना आकार में छोटा हो जाएगा। परीक्षण द्वारा जाकर मैंने नीचे प्रदर्शन किया है। तो इसका उपयोग आकार में एक फायदा होगा।

इसका उपयोग करने के लिए कोई मामला नहीं है, क्योंकि यह अन्य कंपाइलरों में पोर्टेबल नहीं है। तो दृश्य स्टूडियो सी ++ के लिए यह काम नहीं करेगा। इसके अलावा अन्य कंपाइलर्स भी।

क्या संकलक कोड को अनुकूलित नहीं करता है? तो वास्तव में यह तय करने के लिए संकलक को छोड़कर प्रदर्शन के लिए बेहतर क्या होगा?

संरेखित विशेषता का उपयोग करना कोई फर्क पड़ता है? __attribute__((packed, aligned(4))) जब मैं कहा कि यह किसी भी सुझाव के लिए 12.

बहुत धन्यवाद के आकार लौटे,

#include <stdio.h> 

struct padded { 
    int age;  /* 4     */ 
    char initial; /* 1 + 3 padded bytes */ 
    int weight; /* 4  --> total = 12 */ 
}; 

struct __attribute__ ((__packed__)) unpadded { 
    int age;  /* 4     */ 
    char initial; /* 1     */ 
    int weight; /* 4 --> total = 9 */ 
}; 

int main(int argc, char **argv) 
{ 
    struct padded padded_test; 
    struct unpadded unpadded_test; 

    printf("Padded [ %ld ]\n", sizeof(struct padded)); 
    printf("Unpadded [ %ld ]\n", sizeof(struct unpadded)); 
    return 0; 
} 
+4

असाइन की गई मेमोरी एक्सेस धीमी है – BlackBear

+0

अपनी उदाहरण संरचना के लिए, इसे पैक करना * और * 4-संरेखित करना विशेष रूप से गैर-सार्थक है। आप किसी भी स्थान को सहेजते नहीं हैं, आप केवल 'वज़न' फ़ील्ड को डिज़ाइन करते हैं। ऐसा करने का एकमात्र कारण यह है कि इस तरह से परिभाषित कुछ पूर्व-मौजूदा लेआउट से मेल खाना है (और यहां तक ​​कि यह भी मानता है कि आपके प्लेटफॉर्म पर 'int' का ऑब्जेक्ट प्रस्तुति' आयु' फ़ील्ड इत्यादि के लिए सही है)। –

उत्तर

13

unaligned स्मृति पहुँच horrendously कुछ आर्किटेक्चर पर धीमी गति से किया जा सकता है (उदाहरण के लिए ia64, sparc64)। __attribute__((__packed__)) मुख्य रूप से उपयोग के लिए लक्षित है जहां आप तार पर डेटा भेज रहे हैं और लेआउट के बारे में सुनिश्चित करना चाहते हैं; स्मृति में स्थान बचाने के लिए इसका उपयोग करने की कोशिश करने लायक नहीं है।

यदि आप हैं, तो वायर ट्रांसमिशन के लिए __attribute__((__packed__)) का उपयोग करने पर विचार करें, फिर से सोचें; यह अंतहीनता को संभाल नहीं करता है, और यह गैर-मानक है। मार्शलिंग कोड लिखना स्वयं सुरक्षित है, और लाइब्रेरी का उपयोग करना (उदा। प्रोटोकॉल बफर) स्मार्ट है।

+0

+1, सटीक और सीधे बिंदु पर। –

+2

आप पहले से परिभाषित प्रारूप (जैसे सार्वजनिक प्रोटोकॉल) के संचरण के लिए * hpacked__' का उपयोग कर सकते हैं, 'htonl' की पसंद से अंतहीनता से निपटने के लिए। लेकिन फिर भी यह इसके लायक नहीं है, आप स्पष्ट रूप से फ़ील्ड के आकार और ऑफसेट को कोडिंग के बारे में बता रहे हैं क्योंकि आप एक ऐसी संरचना लिख ​​रहे हैं जिसे आप कल्पना से मेल खाते हैं। –

0

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

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