Die meisten C ++ - Compiler haben sich entschieden, beim Abrufen einen Kompilierungsfehler auszulösen sizeof(void)
.
Beim Kompilieren von C ist gcc nicht konform und wird sizeof(void)
als 1 definiert . Es mag seltsam aussehen, hat aber eine Begründung. Wenn Sie eine Zeigerarithmetik ausführen, bedeutet das Hinzufügen oder Entfernen einer Einheit das Hinzufügen oder Entfernen des Objekts, auf das die Größe zeigt. Das Definieren sizeof(void)
als 1 hilft also beim Definieren void*
als Zeiger auf das Byte (untypisierte Speicheradresse). Andernfalls würden Sie überraschende Verhaltensweisen haben, wenn Sie Zeigerarithmetik wie p+1 == p when
p verwenden void*
. Eine solche Zeigerarithmetik für leere Zeiger ist in c ++ nicht zulässig, funktioniert jedoch gut, wenn C mit gcc kompiliert wird.
Die empfohlene Standardmethode wäre die Verwendung char*
für diesen Zweck (Zeiger auf Byte).
Ein weiterer ähnlicher Unterschied zwischen C und C ++ bei Verwendung von sizeof tritt auf, wenn Sie eine leere Struktur wie folgt definiert haben:
struct Empty {
} empty;
Wenn Sie gcc als meinen C-Compiler verwenden, wird sizeof(empty)
0 zurückgegeben. Wenn Sie g ++ verwenden, gibt derselbe Code 1 zurück.
Ich bin nicht sicher, was in diesem Punkt sowohl C- als auch C ++ - Standards angibt, aber ich glaube, dass das Definieren der Größe einiger leerer Strukturen / Objekte bei der Referenzverwaltung hilft, um zu vermeiden, dass zwei Verweise auf unterschiedliche aufeinanderfolgende Objekte, von denen das erste leer ist, die erhalten die gleiche Anschrift. Wenn Referenzen mithilfe versteckter Zeiger implementiert werden, wie dies häufig der Fall ist, hilft das Sicherstellen einer anderen Adresse beim Vergleichen.
Dies vermeidet jedoch lediglich ein überraschendes Verhalten (Vergleich von Referenzen in Eckfällen), indem ein anderes eingeführt wird (leere Objekte, selbst PODs verbrauchen mindestens 1 Byte Speicher).