C ++ size_t oder ptrdiff_t

8

Wenn Sie den folgenden Code haben, wobei p ein Zeiger ist:

%Vor%

Da strlen() und size_t beide size_t sind, sollte ich den Code in ptrdiff_t umsetzen?

%Vor%

Wenn ja, warum?

Danke, Greg

    
wonbyte 07.12.2010, 13:51
quelle

2 Antworten

14

std :: ptrdiff_t ist signiert. std :: size_t ist nicht signiert. Das Umwandeln von strlen(p) in ptrdiff_t würde Sinn ergeben, wenn p eine negative Länge haben könnte, was nicht möglich ist.

Dieser Cast kann jedoch den resultierenden vorzeichenbehafteten Wert überschreiten, wenn p groß genug ist (z. B. größer als 2.147.483.647 Bytes auf den meisten 32-Bit-Plattformen). So könnte es einen Fehler in Ihrer Zeigerarithmetik einführen.

Am besten kleben Sie hier mit size_t .

    
Frédéric Hamidi 07.12.2010, 14:01
quelle
2

Sie müssen nicht nach ptrdiff_t umwandeln. Zeigerarithmetik ist für alle Integraltypen gut definiert, einschließlich size_t , und wenn size_t nicht groß genug ist, um den Wert zu speichern, kommt die Umwandlung in ptrdiff_t sowieso zu spät.

Hier ist die relevante Sprache aus dem Standard (C ++ 0x FCD, Abschnitt [expr.add] ):

  

Wenn ein Ausdruck ein Integral hat   Typ wird zu a hinzugefügt oder von ihm subtrahiert   Zeiger hat das Ergebnis den Typ von   der Zeigeroperand. Wenn der Zeiger   Operand zeigt auf ein Element von einem   Array-Objekt, und das Array ist groß   genug, das Ergebnis zeigt auf ein   Element-Offset vom Original   so dass der Unterschied von   die Indices der resultierenden und   Original-Array-Elemente entsprechen dem   Integraler Ausdruck. Mit anderen Worten,   wenn der Ausdruck P auf das i zeigt   Element eines Array-Objekts, die Ausdrücke (P) + N (äquivalent,   N + (P)) und (P) -N (wobei N die   Wert n) zeigen jeweils auf die   i + n-te und i - n-te Elemente von   das Array-Objekt, sofern sie vorhanden sind.   Außerdem, wenn der Ausdruck P zeigt   bis zum letzten Element eines Arrays   Objekt, der Ausdruck (P) +1 Punkte   eins nach dem letzten Element des Arrays   Objekt, und wenn der Ausdruck Q zeigt   eine nach dem letzten Element eines Arrays   Objekt, der Ausdruck (Q) -1 zeigt auf   das letzte Element des Array-Objekts.   Wenn sowohl der Zeigeroperand als auch der   Ergebnispunkt auf Elemente derselben   Array-Objekt oder eines nach dem letzten   Element des Array-Objekts, das   Bewertung darf kein   Überlauf; Ansonsten ist das Verhalten   undefiniert.

    
Ben Voigt 07.12.2010 14:08
quelle

Tags und Links