2013-04-01 17 views
53

Bei meinem Code verwende ich nicht int oder unsigned int. Ich verwende nur size_t oder ssize_t für portable. Zum Beispiel:sollte size_t oder ssize_t verwenden

typedef size_t intc; // (instead of unsigned int) 
typedef ssize_t uintc; // (instead of int) 

Da strlen, string, vector ... alle size_t verwenden, so in der Regel ich size_t verwenden. Und ich verwende nur ssize_t, wenn es negativ sein kann.

Aber ich finde, dass:

Der unsigned Integer-Typ für Anwendungen ideal ist, die Speicherung als Bit-Array zu behandeln. Die Verwendung von unsigned anstelle von int, um ein weiteres Bit zu erhalten, um positive ganze Zahlen darzustellen, ist fast nie eine gute Idee. Versuche, sicherzustellen, dass einige Werte positiv sind, indem sie Variablen ohne Vorzeichen deklarieren, werden normalerweise durch die impliziten Konvertierungsregeln besiegt.

in dem Buch The C++ Programming Language.

So bin ich verwirrt. Liege ich falsch? Warum hält sich die STL nicht an den Vorschlag auf dem Buch?

+0

'size_t' in Standart-Bibliothek für die Darstellung von Größen verwendet. Es wäre seltsam, wenn die Größe des Containers negativ sein könnte. Die Schnittstelle gibt ihr Verhalten an. Ich denke, dass Buch alltägliche Verwendung annimmt, nicht Schnittstelle – kassak

+1

@kassak - Nein, in diesem Fall wird ein vorzeichenloser Typ tatsächlich * verwendet, um ein zusätzliches Bit für den Wert zu erhalten. Einige Mitglieder des Ausschusses sahen es wichtig, einen 'std :: vector ' größer als die Hälfte des verfügbaren Speichers zu haben. Und das Zitat sagt "* fast * nie" ... –

+0

@Bo Persson, danke, C++ lib benutze size_t für den Bereich. Aber es hat uns die Probleme gebracht. Wenn wir int verwenden, müssen wir vorsichtig sein, sie zu vergleichen. – hgyxbll

Antwort

84

ssize_t wird für Funktionen verwendet, deren Rückgabewert entweder eine gültige Größe oder ein negativer Wert zur Angabe eines Fehlers sein kann. Es ist gewährleistet, dass Werte mindestens im Bereich [-1, SSIZE_MAX] gespeichert werden können (SSIZE_MAX ist systemabhängig).

Sie sollten also size_t verwenden, wenn Sie eine Größe in Bytes zurückgeben wollen, und ssize_t, wenn Sie entweder eine Größe in Bytes oder einen (negativen) Fehlerwert zurückgegeben haben.

See: http://pubs.opengroup.org/onlinepubs/007908775/xsh/systypes.h.html

+0

Ich habe ssize_t anstelle von int verwendet. Weil CPU schnell mit ssize_t umgehen, wenn es x64 ist. – hgyxbll

+14

Nun, diese Antwort erklärt nicht vollständig die Konsequenzen, wenn solche Entscheidungen auf reinen Schnittstellenüberlegungen basieren. Es ist unwahrscheinlich, dass eine Implementierung einen breiteren Typ für 'size_t' verwendet als für 'size_t'.Dies bedeutet sofort, dass der Preis, den Sie für die Rückgabe von negativen Werten zahlen müssen, * die Hälfte des positiven Bereichs des Typs ist. I.e. 'SSIZE_MAX' ist normalerweise' SIZE_MAX/2'. Dies sollte im Hinterkopf behalten werden. In vielen Fällen ist dieser Preis nicht nur für die Möglichkeit, "-1" als negativen Wert zurückzugeben, zu zahlen. – AnT

+3

@AnT mit vorzeichenlosen Werten ist einer der größten Fehler in C++. Es gibt keinen Fall, in dem sich der Preis nicht lohnt. Wenn Sie so große Zahlen benötigen, verwenden Sie stattdessen int64_t ... – thesaint

19

ssize_t ist nicht im Standard enthalten und ist nicht tragbar. size_t sollte verwendet werden, wenn die Größe von Objekten gehandhabt wird (es gibt auch ptrdiff_t für Zeigerunterschiede).

+2

ssize_t stammt von POSIX: http://pubs.opengroup.org/onlinepubs/009696799/basedefs/sys/types.h.html – Kafu

Verwandte Themen