2011-12-27 9 views
32

Lo standard C (ISO/IEC 9899: 2011 o 9899: 1999) definisce un tipo ptrdiff_t in <stddef.h>.Qual è la differenza tra ssize_t e ptrdiff_t?

Lo standard POSIX (ISO/IEC 9945; IEEE Std 1003.1-2008) definisce un tipo ssize_t in <sys/types.h>.

  • Qual è la differenza tra questi tipi (o perché entrambi sono stati ritenuti necessari)?
  • Esiste un'implementazione in cui il tipo di base sottostante per ssize_t non è lo stesso di ptrdiff_t?
+3

forse è la semantica di 'ptrdiff_t' che ha richiesto l'aggiunta di' ssize_t'? A volte, un tipo di dimensione firmata è utile, se vuoi essere in grado di avere immediatamente un valore '-1'. La semantica di 'ptrdiff_t' è" differenza tra due puntatori ", che non è esattamente la semantica della" dimensione ". –

+1

Probabilmente un po 'di paranoia NIH nei comitati stadards rilevanti –

risposta

22

C'è un'implementazione in cui il tipo di base sottostante per ssize_t non è la stessa per ptrdiff_t?

x86-16 con il modello di memoria di grandi dimensioni. I puntatori sono lontani (32 bit), ma i singoli oggetti sono limitati a un segmento (quindi è possibile che size_t sia 16 bit).

+9

non sarebbe 'ptrdiff_t' anche 16 bit in quella situazione, poiché la differenza del puntatore viene definita solo quando entrambi i puntatori puntano allo stesso oggetto ... –

+4

@Dhris:' ptrdiff_t 'è un tipo definito dall'implementazione e la sua dimensione di puntatore sembra ragionevole. Le operazioni sui puntatori non dovrebbero sorprendere nessuno che abbia familiarità con il modello di memoria, e un 'ptrdiff_t' a 16 bit sorprenderebbe probabilmente le persone che usano i puntatori a 32 bit. –

+7

@ChrisDodd: un oggetto può avere fino a 65535 byte, quindi una sottrazione di puntatore valida potrebbe facilmente superare 32767; per 'ptrdiff_t', vuoi un tipo firmato che possa contenere valori fino a 65536. –

18

Il Gruppo Base Apri scheda Numero 7, IEEE Std 1003.1 2013 Edition, descrizione di <sys/types.h> dice:

Il tipo ssize_t è in grado di memorizzare i valori almeno nell'intervallo [-1, SSIZE_MAX].

In altre parole, ssize_t è firmata, ma l'insieme dei valori negativi può rappresentare può essere limitata al solo {} -1.

A ptrdiff_t, al contrario, è garantito un intervallo positivo/negativo più simmetrico.

Ammetto che, in pratica, non sembra probabile che ssize_t sia limitato nel range negativo, ma è possibile.

Naturalmente, un'altra differenza è che ptrdiff_t è disponibile ogni volta che si programma in C standard o C++, ma ssize_t potrebbero non essere disponibili a meno che non ci si rivolge un sistema POSIX standard.

+0

Grazie per le informazioni storiche; aiuta a spiegare da dove viene, anche se lo standard attuale non impone più l'intervallo. (La mia ricerca dello standard attuale non era quella che considererei definitiva, anche se credo che fosse abbastanza approfondita, quindi la "donnola" di "non sembra essere nello standard del 2008"). –

+0

Non ero Ho familiarità con 'ssize_t' prima di oggi. Stavo solo indicando cosa ho imparato dai risultati di ricerca principali. –

+2

[2008 'sys/types.h' standard] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html) ha lo stesso requisito' [-1, {SSIZE_MAX}] ' 'ssize_t'. – jw013

Problemi correlati