Zuerst könnte man denken std::numeric_limits<size_t>::max()
, aber wenn es ein riesiges Objekt gäbe, könnte es trotzdem einen "one-over-the-end" -Zeiger bieten? Ich denke nicht. Bedeutet das den größten Wert sizeof(T)
könnte ergeben ist std::numeric_limits<size_t>::max()-1
? Habe ich recht, oder fehlt mir etwas?
F: Was ist die größte Wertgröße von (T) kann ergeben?
A: std::numeric_limits<size_t>::max()
Natürlich kann sizeof keinen Wert zurückgeben, der größer als std::numeric_limits<size_t>::max()
ist, da er nicht passt. Die einzige Frage ist, kann es ...::max()
zurückgeben?
Ja. Hier ist ein gültiges Programm, das keine Einschränkungen des C ++ 03-Standards verletzt, der ein Beweis-für-Beispiel demonstriert. Insbesondere verletzt dieses Programm keine der in § 5.3.3 [expr.sizeof] oder in § 8.3.4 [dcl.array] aufgeführten Einschränkungen:
%Vor% Wenn std::numeric_limits<ptrdiff_t>::max() > std::numeric_limits<size_t>::max()
berechnet werden kann, können Sie die Größe eines Objekts der Größe std::numeric_limits<size_t>::max()
berechnen, indem Sie einen Zeiger von einem Zeiger nach dem anderen abziehen.
Wenn sizeof(T*) > sizeof(size_t)
, können Sie genug verschiedene Zeiger haben, um jedes einzelne Byte in diesem Objekt zu adressieren (falls Sie zum Beispiel ein Array von Zeichen haben) plus eins für eins nach dem anderen.
Es ist also möglich, eine Implementierung zu schreiben, in der sizeof
std::numeric_limits<size_t>::max()
zurückgeben kann und wo Sie den Zeiger auf eins nach dem Ende eines so großen Objekts setzen können.
es ist nicht genau definiert. Um jedoch innerhalb der sicheren Grenzen des Standards zu bleiben, ist die maximale Objektgröße std::numeric_limits<ptrdiff_t>::max()
Das liegt daran, dass Sie, wenn Sie zwei Zeiger subtrahieren, ein ptrdiff_t
ist ein vorzeichenbehafteter Integer-Typ
Prost & amp; hth.,
Die Anforderung, über das Ende eines Arrays hinaus zeigen zu können, hat nichts mit dem Bereich von size_t
zu tun. Bei einem Objekt x
ist es durchaus möglich, dass (&x)+1
ein gültiger Zeiger ist, auch wenn die Anzahl der Bytes, die die beiden Zeiger trennen, nicht durch size_t
dargestellt werden kann.
Sie könnten argumentieren, dass die Anforderung eine Obergrenze für die Objektgröße des maximalen Bereichs von Zeigern minus der Ausrichtung des Objekts impliziert. Ich glaube jedoch nicht, dass der Standard irgendwo sagt, dass ein solcher Typ nicht definiert werden kann; es wäre einfach unmöglich zu instantiieren und trotzdem konform zu bleiben.
Ein sizeof()
Ausdruck liefert einen Wert vom Typ size_t
. Ab C99 Standard 6.5.3.4:
Der Wert des Ergebnisses ist implementierungsdefiniert und sein Typ (a Ganzzahl ohne Vorzeichen) ist size_t, definiert in stddef.h (und anderen Header).
Daher ist der maximale Wert, den sizeof () liefern kann, SIZE_MAX.
Sie können einen standardkompatiblen Compiler haben, der Objektgrößen erlaubt, die die Zeigerarithmetik überlaufen lassen; Das Ergebnis ist jedoch undefiniert. Aus dem C ++ - Standard, 5.7 [expr.add]:
Wenn zwei Zeiger auf Elemente desselben Array-Objekts subtrahiert werden, Das Ergebnis ist die Differenz der Indizes der beiden Arrays Elemente. Der Typ des Ergebnisses ist ein implementierungsdefiniertes signed integraler Typ; dieser Typ muss vom selben Typ sein, der als definiert ist
std::ptrdiff_t
in der Kopfzeile<cstddef>
(18.2). Wie bei jedem anderen arithmetischer Überlauf, wenn das Ergebnis nicht in den vorgesehenen Platz passt, Das Verhalten ist nicht definiert.