Was ist die größte Wertgröße von (T) kann ergeben?

8

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?

    
fredoverflow 31.10.2011, 19:26
quelle

7 Antworten

3
  

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%     
Robᵩ 31.10.2011, 19:37
quelle
3

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.

    
R. Martinho Fernandes 31.10.2011 19:47
quelle
2

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

erhalten

ist ein vorzeichenbehafteter Integer-Typ

Prost & amp; hth.,

    
Cheers and hth. - Alf 31.10.2011 19:41
quelle
1

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.

    
Mike Seymour 31.10.2011 20:16
quelle
0

Wenn das ein Test wäre, würde ich (size_t) -1

sagen     
Zach Rattner 31.10.2011 19:30
quelle
0

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.

    
Ambroz Bizjak 31.10.2011 19:31
quelle
0

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.

    
MSN 31.10.2011 19:56
quelle

Tags und Links