Dies ist ursprünglich ein Teil einer anderen Frage.
Warum wird sizeof
ein Operator zur Kompilierungszeit genannt? Ist es nicht tatsächlich ein Laufzeitoperator? Und wenn es sich in der Tat um einen Operator zur Kompilierungszeit handelt, wie kann er dazu beitragen, portablen Code zu erstellen, der auf verschiedenen Computern gleich ausgeführt wird? Bitte erläutern Sie im Detail.
sizeof(polymorphic_ptr*)
dass es ziemlich kontraintuitiv und einfach albern ist, konstant zu sein. Ja, es ist der C ++ - Weg, aber trotzdem albern.Antworten:
sizeof()
gibt die Größe des Datentyps an , nicht die Größe einer bestimmten Instanz dieses Typs im Speicher.Wenn Sie beispielsweise ein Zeichenfolgendatenobjekt hatten, das zur Laufzeit ein Zeichenarray mit variabler Größe zugewiesen hat,
sizeof()
konnte die Größe dieses Zeichenarrays nicht ermittelt werden. Es würde Ihnen nur die Größe des Zeigers geben.Die Größe eines Datentyps ist beim Kompilieren immer bekannt.
quelle
sizeof
auf einem Array, Sie werden die Größe des Arrays erhalten (die die Elementgröße multipliziert mit der Anzahl der Elemente). Wenn Sie es jedoch für einen Zeiger verwenden, erhalten Sie nur die Größe des Zeigers. Da Sie in den meisten Fällen, in denen Sie die Größe eines Arrays kennen möchten, nur einen Zeiger haben, ist dies nicht besonders nützlich.da die gesamte Größe von "call" zur Kompilierungszeit berechnet wird und alles, was sich zwischen den Klammern befindet, verworfen und nicht zur Laufzeit ausgeführt wird,
Das Ergebnis basiert ausschließlich auf statischen Typinformationen, die dem Compiler zur Verfügung stehen
quelle
Weil der Compiler zur Kompilierzeit die Größe des Ausdrucks berechnet und diesen konstanten Wert zur Kompilierzeit ersetzt.
Nein. Sie können sogar
sizeof
die Größe von Ausdrücken auswerten, die Sie nicht legal ausführen können (dh die ein undefiniertes Verhalten verursachen würden), solange der Compiler den Typ des Ausdrucks ermitteln kann.Darüber hinaus
constexpr
können Siesizeof
Ausdrücke auch vor C ++ 11 so verwenden, dass Laufzeitausdrücke nicht verwendet werden können.Die Typen können auf verschiedenen Plattformen unterschiedlich groß sein. Die Verwendung von
sizeof
Ausdrücken anstelle von fest codierten Annahmen bedeutet, dass Ihr Code nicht beschädigt wird, wenn Sie auf einer anderen Plattform kompilieren und Ihre Typen die Größe ändern.quelle
C ++ speichert die Metadaten für Objekte nicht zur Laufzeit, daher muss die Größenprüfung zur Kompilierungszeit erfolgen. Deklarieren Sie für ein Beispiel, wie C ++ Größe nicht überprüft, ein Array von
int
beliebiger Größe und lesen Sie über das Ende davon hinaus. Wenn Sie Glück haben, werden Siesegfault
wahrscheinlich nur Kauderwelsch lesen, da C ++ die Größe Ihres Arrays nicht nachverfolgt.Siehe Kann ein C / C ++ - Programm das Lesen nach dem Ende eines Arrays (UNIX) verhindern? für ein Beispiel aus SO.
quelle