2011-12-27 13 views
32

सी मानक (आईएसओ/आईईसी 9899: 2011 या 9899: 1999) <stddef.h> में एक प्रकार ptrdiff_t परिभाषित करता है।ssize_t और ptrdiff_t के बीच क्या अंतर है?

पॉज़िक्स मानक (आईएसओ/आईईसी 9945; आईईईई स्टडी 1003.1-2008) <sys/types.h> में एक प्रकार को परिभाषित करता है।

  • इन प्रकारों (या दोनों आवश्यक समझा गया क्यों) के बीच क्या अंतर है?
  • वहाँ एक कार्यान्वयन जहां ssize_t के लिए अंतर्निहित आधार प्रकार ptrdiff_t के समान नहीं है?
+3

शायद यह 'ptrdiff_t' कि' ssize_t' के अलावा के लिए बुलाया के शब्दों है? कभी-कभी, एक हस्ताक्षरित आकार का प्रकार उपयोगी होता है, यदि आप मध्यस्थ रूप से इसे '-1' का प्रतिनिधित्व करने में सक्षम होना चाहते हैं। 'Ptrdiff_t' का अर्थशास्त्र" दो बिंदुओं के बीच अंतर "है, जो वास्तव में" आकार "का अर्थशास्त्र नहीं है। –

+1

संभावित स्टैडर्ड समितियों में शायद एनआईएच परावर्तक का थोड़ा सा –

उत्तर

22

वहाँ एक कार्यान्वयन जहां ssize_t के लिए अंतर्निहित आधार प्रकार ptrdiff_t के समान नहीं है?

बड़े स्मृति मॉडल के साथ x86-16। पॉइंटर्स दूर (32-बिट) हैं, लेकिन अलग-अलग ऑब्जेक्ट्स एक सेगमेंट तक सीमित हैं (इसलिए size_t को 16-बिट होने की अनुमति है)।

+9

उस स्थिति में 'ptrdiff_t' भी 16 बिट्स नहीं होगा, क्योंकि पॉइंटर अंतर केवल तभी परिभाषित किया जाता है जब दोनों पॉइंटर्स एक ही ऑब्जेक्ट पर इंगित करते हैं ... –

+4

@Drris: 'ptrdiff_t 'एक कार्यान्वयन-परिभाषित प्रकार है, और इसे एक सूचक का आकार उचित लगता है। पॉइंटर्स पर ऑपरेशंस मेमोरी मॉडल से परिचित किसी के लिए असंतुलित होना चाहिए, और 16-बिट 'ptrdiff_t' 32-बिट पॉइंटर्स का उपयोग करने वाले लोगों को आश्चर्यचकित करेगा। –

+7

@ChrisDodd: एक वस्तु अप करने के लिए 65535 बाइट्स, तो एक वैध सूचक घटाव आसानी से 32767 को पार कर सकते हो सकता है; 'ptrdiff_t' के लिए, आप एक हस्ताक्षरित प्रकार चाहते हैं जो 65536 तक मान रख सके। –

18

ओपन समूह बेस विनिर्देशों अंक 7, IEEE Std 1003.1, 2013 संस्करण, <sys/types.h> का वर्णन कहते हैं:

प्रकार ssize_t रेंज [-1, SSIZE_MAX] में कम से कम मूल्यों संग्रहित करने में सक्षम है।

दूसरे शब्दों में, ssize_t हस्ताक्षरित किया गया है, लेकिन ऋणात्मक मानों यह प्रतिनिधित्व कर सकते हैं के सेट करने के लिए सीमित किया जा सकता बस {-1}।

एक ptrdiff_t, दूसरे हाथ पर, एक और अधिक सममित सकारात्मक/नकारात्मक श्रृंखला है करने के लिए गारंटी है।

मैं मानता हूं कि व्यावहारिक रूप से, ऐसा लगता है कि ssize_t नकारात्मक सीमा में सीमित होगा, लेकिन यह संभव है।

बेशक

, एक और अंतर यह है कि जब भी आप ptrdiff_t मानक सी या सी ++ में प्रोग्रामिंग कर रहे हैं उपलब्ध है, लेकिन ssize_t उपलब्ध जब तक आप एक मानक POSIX प्रणाली को लक्षित कर रहे नहीं हो सकता।

+0

ऐतिहासिक जानकारी के लिए धन्यवाद होगा से अधिक का आवंटन कर सकता है; यह बताता है कि यह कहां से आया था, भले ही वर्तमान मानक अब सीमा को अनिवार्य न करे। (वर्तमान मानक की मेरी खोज वह नहीं थी जिसे मैं निश्चित रूप से मानता हूं, हालांकि मुझे विश्वास है कि यह काफी गहन था, इसलिए '' मानक 'शब्द' 2008 मानक में प्रतीत नहीं होता है।) –

+0

मैं नहीं था ' आज से पहले ssize_t' से परिचित नहीं है। मैं सिर्फ शीर्ष खोज परिणाम से जो सीखा, उसे इंगित कर रहा था। –

+2

[2008 'sys/types.h' मानक] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html) एक ही' [-1, {SSIZE_MAX}] 'के लिए आवश्यकता है 'ssize_t'। – jw013

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