पैक्ड संरचनाएं सी भाषा का हिस्सा क्यों नहीं हैं?


10

हर सी कंपाइलर सी संरचनाओं (जैसे __attribute__ ((__packed__)), या #pragma pack()) को "पैक" करने का विकल्प प्रदान करता है । अब, हम सभी जानते हैं कि पैकिंग की आवश्यकता होती है, अगर हम विश्वसनीय तरीके से डेटा भेजना या संग्रहीत करना चाहते हैं। सी भाषा के पहले दिनों से यह एक आवश्यकता भी रही होगी।

तो मुझे आश्चर्य है कि पैक्ड संरचनाएं सी भाषा विनिर्देश का हिस्सा क्यों नहीं हैं? वे C99 या C11 में भी नहीं हैं, भले ही उन्हें होने की आवश्यकता दशकों से ज्ञात हो? मुझे क्या याद आ रहा है? यह विशिष्ट क्यों है?


2
उन्हें शुद्ध C कोड लिखना आवश्यक नहीं है।
user253751

जवाबों:


7

मुझे लगता है कि यह इसलिए है क्योंकि यह लक्ष्य सीपीयू / संकलक के संयोजन पर निर्भर करता है। इसका मतलब यह है कि भाषा के पहलू की तुलना में एक कंपाइलर निर्देश (जैसा कि इससे संबंधित है) होना बेहतर है, क्योंकि इसे कैसे निर्दिष्ट किया जाए? एकमात्र तरीका वे इसे संघ के साथ कर सकते थे।

रेमंड के लेख में कुछ अंतर्दृष्टि दी गई है कि यह क्यों है: http://www.catb.org/esr/structure-packing/


बहुत ही रोचक लेख। (+1)
जियोर्जियो

कोड को यह कहने की अनुमति देने में क्या कठिनाई होगी "मुझे 12 बाइट्स वाली एक संरचना की आवश्यकता है; फ़ील्ड X को ऑफसेट 0 पर चार ऑक्टेटस-एंडियन के रूप में संग्रहीत 32-बिट पूर्णांक के रूप में व्यवहार करना चाहिए; फ़ील्ड Y को 64-बिट पूर्णांक के रूप में व्यवहार करना चाहिए। ऑक्टेट्स के रूप में संग्रहीत ऑफ़सेट 4 में थोड़ा-एंडियन बाइट्स? किसी भी प्लेटफ़ॉर्म पर हैंडल करने के लिए कोड किसी भी तरह से खराब नहीं होना चाहिए क्योंकि पहले से ही बिटफ़िल्ड के लिए कंपाइलर्स की तरह है, और ऐसे मामलों में जहां प्रोग्रामर संरेखण को निर्दिष्ट करने के लिए होता है जो कि देशी मशीन से मेल खाता है और अधिक कुशल हो सकता है। अन्य मशीनों पर, यह कम कुशल लेकिन फिर भी पोर्टेबल होगा।
सुपरकैट

5

इसके तीन मुख्य कारक हैं।

  1. कुछ प्रोसेसर अनलगनेटेड डेटा तक नहीं पहुँच सकते हैं (उदाहरण के लिए एक पूर्णांक या एक अजीब पते पर शुरू होने वाला फ्लोट)। एक अपवाद को ट्रिगर करने का प्रयास करना।
  2. कुछ प्रोसेसर बिना डेटा के पहुँच सकते हैं, लेकिन एक प्रदर्शन लागत पर।
  3. अधिकांश संरचनाएं C / C ++ स्रोत कोड के एकल सेट द्वारा एक्सेस की जाती हैं, और अन्य भाषाओं के साथ इंटरऑपरेबिलिटी अपवाद है, नियम नहीं।

इन कारकों को ध्यान में रखते हुए, दोनों मानक और सभी C / C ++ प्रोसेसर के लिए इष्टतम संरेखण सुनिश्चित करने के लिए नियमित रूप से पैड संरचनाओं का संकलन करते हैं, लेकिन इंटरॉप के प्रयोजनों के लिए आवश्यक होने पर इसे ओवरराइड करने के लिए भी तंत्र प्रदान करते हैं।

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


पैक्ड संरचनाओं के खिलाफ किए जाने वाले किसी भी तर्क का उपयोग बिटफ़िल्ड को एक वैकल्पिक सुविधा बनाने के औचित्य के लिए भी किया जा सकता है। पैक्ड स्ट्रक्चर्स के एक्सेस करने वाले सदस्य कुछ प्रोसेसर पर धीमे होंगे, दूसरों पर तेजी से, लेकिन कंपाइलर होने के कारण उपयोगकर्ता-कोड वर्कअराउड्स को बदलने की कोशिश करते हैं, जो कि बिना कुशल कोड वाले फीचर्स की कमी के कारण अधिक कुशल कोड की तुलना में अधिक जटिल है, बस कंपाइलरों को प्रोग्रामर को रखने दें। उन्हें जरूरत है।
सुपरकैट 25:16

@ सुपरकैट: आप (या खिलाफ) क्या बहस कर रहे हैं? मुझे नहीं मिला।
david.pfx

मेरी राय है कि बिटफ़िल्ड वैकल्पिक होना चाहिए, लेकिन अगर बिटफ़िल्ड एक अनिवार्य विशेषता होने जा रही है, तो यह उन्हें इस तरह से विस्तारित करने के लिए समझ में आता है जो संरचना लेआउट के स्पष्ट नियंत्रण की अनुमति देता है। अन्यथा, शुद्ध प्रभाव यह है कि कम्प्रेसर को 90% काम करना पड़ता है जो लेआउट के पूर्ण नियंत्रण के लिए आवश्यक होगा, लेकिन प्रोग्रामर केवल 10% लाभ प्राप्त करते हैं।
सुपरकैट

@supercat: बिट-फ़ील्ड पूर्णांक हैं और पूर्णांक के रूप में उसी बिट लेआउट ऑर्डरिंग नियमों का पालन करते हैं: कार्यान्वयन परिभाषित। संरचना के सदस्यों को वर्ण सीमाओं पर घोषित किया जाता है, संभवतः पैकिंग सम्मिलित के साथ। वे वैचारिक रूप से काफी अलग हैं। [यदि आप अपने प्रस्ताव पर विस्तार करना चाहते हैं, तो आपको एक और सवाल पूछने की आवश्यकता होगी, लेकिन मुझे नहीं लगता कि यह बिल्कुल काम करेगा।]
david.pfx

0

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

और उस प्रयास में से किसी का भी अधिक औचित्य नहीं है, क्योंकि प्रत्येक कंपाइलर / प्लेटफ़ॉर्म जिसे C89 या बाद के संकलक का उपयोग करने वाला कोई भी व्यक्ति पहले से ही इसे लागू करता है।


2
??? आपने इस सवाल का जवाब दिया कि "मानक भाषा में क्यों नहीं है" यह कहकर "क्योंकि मानक में नहीं है" ...
एमिलियो गारागावलिया

यही मैंने पहले सोचा था, लेकिन फिर, कोई व्यक्ति "जैसी सुविधा के साथ परिभाषित किया जा सकता है" अगर यह सुविधा 'पैक' के साथ परिभाषित की जाती है, तो इसका आकार प्रत्येक व्यक्तिगत सदस्य के जोड़े गए आकार के समान होने की गारंटी है। अन-असाइन किए गए मेमोरी एक्सेस, स्ट्रक्चर मेंबर में से किसी एक वैल्यू तक पहुंच अपरिभाषित व्यवहार है। " यह बिना किसी पहुंच के प्लेटफॉर्म पर डेवलपर्स को कम से कम
स्ट्रक्चर्स

1
सिस्टम पर अनलॉग्ड एक्सेस कार्य करना संभव होगा जो बाइट्स की एक सरणी के रूप में ऐसी संरचनाओं को लागू करने और प्रत्येक क्षेत्र के मूल्यों को पढ़ने / लिखने के लिए आवश्यक बिट-शिफ्टिंग और &/ |संचालन का प्रदर्शन करके हार्डवेयर में इसका समर्थन नहीं करता है ।
dan04

1
@ dan04: कई प्रोसेसरों पर, एक संकलक अनइंस्टॉल एक्सेस के लिए कोड उत्पन्न कर सकता है जो बाइट रीड और शिफ्ट के अनुक्रम का उपयोग करने से अधिक कुशल था। इसके लिए एक सिंटैक्स होने से ऐसे कंपाइलरों के लिए कुशल कोड उत्पन्न करना आसान हो जाता है, जिससे उन्हें पहचानने की आवश्यकता होती है कि प्रोग्रामर को अलग-अलग प्रकार से बाइट इकट्ठा करने के लिए कोड लिखने का प्रयास करना चाहिए।
सुपरकाट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.