2011-12-27 21 views
32

Norma C (ISO/IEC 9899: 2011 lub 9899: 1999) definiuje typ ptrdiff_t w <stddef.h>.Jaka jest różnica między ssize_t i ptrdiff_t?

Standard POSIX (ISO/IEC 9945, IEEE Std 1003.1-2008) definiuje typ ssize_t w <sys/types.h>.

  • Jaka jest różnica między tymi typami (lub dlaczego oba zostały uznane za konieczne)?
  • Czy istnieje implementacja, w której bazowy typ bazowy dla ssize_t nie jest taki sam jak dla ptrdiff_t?
+3

Być może jest to semantyka 'ptrdiff_t', która wywołała dodanie' ssize_t'? Czasami użyteczny jest podpisany typ rozmiaru, jeśli chcesz mieć możliwość pośredniego przedstawienia go jako "-1". Semantyka 'ptrdiff_t' to" różnica między dwoma wskaźnikami ", która nie jest dokładnie semantyką" rozmiaru ". –

+1

Prawdopodobnie trochę paranoi NIH w odpowiednich komitetach stadninowych –

Odpowiedz

22

Czy istnieje implementacja gdzie bazowy typ bazowy dla ssize_t nie jest taka sama jak dla ptrdiff_t?

x86-16 z dużym modelem pamięci. Wskaźniki są daleko (32-bitowe), ale poszczególne obiekty są ograniczone do jednego segmentu (więc size_t może mieć 16-bit).

+9

w tym przypadku nie miałoby "ptrdiff_t" również 16 bitów, ponieważ różnica wskaźnika jest określona tylko wtedy, gdy oba wskaźniki wskazują na ten sam obiekt ... –

+4

@Dhris: 'ptrdiff_t 'jest typem definiowanym przez implementację i sprawia, że ​​rozmiar wskaźnika jest rozsądny. Operacje na wskaźnikach nie powinny zaskakiwać nikogo obeznanego z modelem pamięci, a 16-bitowe 'ptrdiff_t' prawdopodobnie zaskoczyłoby ludzi używających wskaźników 32-bitowych. –

+7

@ChrisDodd: Obiekt może mieć maksymalnie 65535 bajtów, więc prawidłowe odejmowanie wskaźnika może z łatwością przekroczyć 32767; dla 'ptrdiff_t', potrzebujesz podpisanego typu, który może przechowywać wartości do 65536. –

18

Otwarta grupa bazowa techniczne wydanie 7, IEEE 1003.1 2013 Edition opis <sys/types.h> mówi:

typu ssize_t jest zdolny do przechowywania wartości przynajmniej zakresu [-1, SSIZE_MAX].

Innymi słowy ssize_t podpisaniu ale zbiór wartości ujemnych może reprezentować może być ograniczona do tylko {-1}.

Z drugiej strony gwarantuje się, że A ptrdiff_t ma bardziej symetryczny zakres dodatni/ujemny.

muszę przyznać, że w praktyce nie wydaje się prawdopodobne, że ssize_t byłoby to ograniczone w ujemnym zakresie, ale jest to możliwe.

Oczywiście inną różnicą jest to, że ptrdiff_t jest dostępna, gdy programujesz w standardowym C lub C++, ale ssize_t może być niedostępny, chyba że kierujesz się na standardowy system POSIX.

+0

Dzięki za informacje historyczne; pomaga wyjaśnić, skąd się wziął, nawet jeśli obecny standard nie wymaga już zakresu. (Moje poszukiwania obecnego standardu nie były tym, co uważam za definitywne, chociaż uważam, że był dość dokładny, stąd "słówka" z "nie wydaje się być w standardzie z 2008 roku".) –

+0

Nie byłem " znają 'ssize_t' przed dzisiaj. Właśnie wskazywałem na to, czego dowiedziałem się z najlepszego wyniku wyszukiwania. –

+2

[2008 'sys/types.h' standard] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html) ma takie same wymagania' [-1, {SSIZE_MAX}] 'dla 'ssize_t'. – jw013

Powiązane problemy