2015-03-07 6 views
11

पुस्तक सी प्रोग्रामिंग भाषा के बारे में "सबसे प्रतिबंधात्मक प्रकार" वार्ता खंड 8.7 में, उदाहरण — एक भंडारण संभाजक:सी में सबसे प्रतिबंधित प्रकार का क्या मतलब है?

हालांकि मशीनों में भिन्नता है, प्रत्येक मशीन के लिए वहाँ एक सबसे प्रतिबंधात्मक प्रकार है : यदि सबसे प्रतिबंधित प्रकार किसी विशेष पते पर संग्रहीत किया जा सकता है, तो अन्य सभी प्रकार भी हो सकते हैं। कुछ मशीनों पर, सबसे अधिक प्रतिबंधित प्रकार double है; दूसरों पर, int या long पर्याप्तताएं।

उनके कोड में, unionheader प्रकार long का उपयोग कर गठबंधन है।

सबसे प्रतिबंधित प्रकार का क्या अर्थ है? क्या यह शायद सबसे बड़ा प्रकार है (उदा।, double), या कोई और दृष्टिकोण है?

+1

सभी प्रकार के संघ को परिभाषित करता है और सबसे प्रतिबंधित प्रकार – BsD

+1

@BsD - जो आपको सबसे बड़ा प्रकार देता है, संघ के आकार को देखता है। यह सबसे अधिक प्रतिबंधक हो सकता है या नहीं भी हो सकता है। –

उत्तर

13

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

द्वारा सबसे अधिक प्रतिबंधक प्रकार, उनका मतलब है कि इस क्षेत्र में सबसे अधिक प्रतिबंधक आवश्यकताएं हैं। तो अगर उदा। long double को कुछ मशीन पर आठ-बाइट संरेखण की आवश्यकता है, और किसी अन्य प्रकार की तुलना में अधिक संरेखण की आवश्यकता नहीं है, तो उस मशीन पर सबसे प्रतिबंधित प्रकार long double होगा।

यहके लिए सबसे अधिक प्रतिबंधक प्रकार की संरेखण आवश्यकताओं को पूरा करने वाले पते को वापस करने के लिए समझ में आता है, क्योंकि इसका मतलब है कि लौटाई गई स्मृति किसी भी प्रकार को स्टोर करने के लिए उपयोग की जा सकती है। malloc() नहीं जानता कि स्मृति का उपयोग कैसे किया जाएगा, इसलिए यह अनुकूलित नहीं हो सकता है।

यह आवश्यक नहीं है कि बड़े डेटा प्रकारों को अधिक संरेखण की आवश्यकता हो, हालांकि संरेखण आवश्यकताओं में बढ़ते आकार के साथ वृद्धि होती है।

(कुछ डेटा के प्रकार और भी अधिक संरेखण से malloc() प्रदान करता है। उदाहरण के लिए, कई x86 SSE निर्देश डेटा वैक्टर कि 16 बाइट्स पर गठबंधन कर रहे हैं का उपयोग करें, जबकि उदाहरण के लिए glibc में malloc() केवल गारंटी देता आठ-बाइट संरेखण पड़ सकता है। posix_memalign(3) कर सकते हैं POSIX (* निक्स) सिस्टम पर भी अधिक संरेखण आवश्यकताओं के साथ स्मृति को गतिशील रूप से आवंटित करने के लिए उपयोग किया जा सकता है।)

2

मुझे लगता है कि उद्धरण का अर्थ प्रकारों का सबसे प्रतिबंधित संरेखण है। उदाहरण के लिए यदि इस तर्क का पालन करना है तो चार कम से कम पुनर्गठन प्रकार है। टाइप चार का एक ऑब्जेक्ट इसके संरेखण पर बाधा उत्पन्न नहीं करता है, उदाहरण के लिए टाइप int में आमतौर पर 4 बाइट सीमाओं की संरेखण आवश्यकता होती है। इस प्रकार int char से अधिक प्रतिबंधित प्रकार है।

4

सबसे प्रतिबंधित प्रकार max_align_t द्वारा परिभाषित किया गया है, जिसे stddef.h में परिभाषित किया गया है।मानक के अनुसार:

एक मौलिक संरेखण एक संरेखण से या जो _Alignof (max_align_t) के बराबर है सबसे बड़ी संरेखण सभी संदर्भों में कार्यान्वयन द्वारा समर्थित है, के बराबर कम का प्रतिनिधित्व करती है।

तो max_align_t एक संरेखण कि कम से कम के रूप में हर अदिश प्रकार के रूप में बड़ी है, और अधिकांश प्रयोगों में अपनी संरेखण सबसे बड़ा अदिश प्रकार के बराबर होगा - लेकिन इस समानता के लिए आवश्यक नहीं है मानक।

मानक आगे की आवश्यकता है (जोर मेरा):

आदेश और aligned_alloc, calloc, malloc को लगातार कॉल द्वारा आवंटित भंडारण की समीपता, और realloc कार्यों अनिर्दिष्ट है। सूचक लौटे आवंटन सफल होता है उपयुक्त रूप से गठबंधन किया है, ताकि वह एक मौलिक संरेखण आवश्यकता के साथ वस्तु की किसी भी प्रकार के लिए सूचक को सौंपा जा सकता है और उसके बाद इस्तेमाल किया पहुँच इस तरह के एक वस्तु या में इस तरह की वस्तुओं की एक सरणी के लिए अंतरिक्ष आवंटित (जब तक कि स्थान स्पष्ट रूप से हटाया नहीं जाता है)।

इसलिए किसी भी सूचक आवंटन कार्यों द्वारा दिया max_align_t के संरेखण के रूप में कम से कम गठबंधन है के रूप में सख्ती से।

+2

@downvoter समझाने के लिए देखभाल? –

+0

मैं डाउनवॉटर नहीं हूं, लेकिन हो सकता है कि वे प्रकारों की संरेखण आवश्यकताओं की अवधारणा का एक उच्च स्तरीय अवलोकन चाहते थे। 'Max_align_t' में खोदना और उस भाग को प्राप्त करने से पहले मानक से मार्ग थोड़ा अधिक हो सकता है। – Ulfalizer

+1

@Ulfalizer मेला पर्याप्त है, लेकिन यह वास्तव में एक डाउनवोट को उचित नहीं ठहराता है .. सवाल मुझे पूरी तरह से स्पष्ट नहीं था, और मेरा जवाब विशेष रूप से "सबसे अधिक प्रतिबंधित प्रकार का मतलब है, शायद सबसे बड़ा प्रकार का आकार (fe डबल) या सवाल का एक और दृष्टिकोण है। –

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