La maggior parte dei compilatori C++ ha scelto di generare un errore di compilazione durante il tentativo di ottenere sizeof(void)
.
Durante la compilazione di C, gcc non è conforme e ha scelto di definire sizeof(void)
come 1. Può sembrare strano, ma ha una logica. Quando si esegue l'aritmetica del puntatore aggiungendo o rimuovendo un'unità si intende aggiungere o rimuovere l'oggetto che punta alla dimensione. Quindi definire sizeof(void)
come 1 aiuta a definire void*
come puntatore al byte (indirizzo di memoria non tipizzato). Altrimenti si avrebbero comportamenti sorprendenti usando l'aritmetica del puntatore come p+1 == p when
p è void*
. Tale puntatore aritmetico sui puntatori void non è consentito in C++ ma funziona bene quando si compila C con gcc.
Il modo standard consigliato sarebbe quello di utilizzare char*
per questo tipo di scopo (puntatore a byte).
Un'altra differenza simile tra C e C++ quando si utilizza sizeof si verifica quando si è definito uno struct vuoto come:
struct Empty {
} empty;
Utilizzando gcc come il mio compilatore C sizeof(empty)
restituisce 0. Utilizzando g ++ lo stesso codice restituirà 1.
Non sono sicuro di ciò che indica gli standard C e C++ su questo punto, ma credo che definire la dimensione di alcune strutture/oggetti vuoti aiuti con la gestione dei riferimenti per evitare che due riferimenti a oggetti consecutivi diversi, il primo sia vuoto, ottieni lo stesso indirizzo. Se i riferimenti vengono implementati utilizzando i puntatori nascosti come spesso accade, assicurare un indirizzo diverso aiuterà a confrontarli.
Ma si tratta semplicemente di evitare un comportamento sorprendente (confronto tra maiuscole e minuscole dei riferimenti) mediante l'introduzione di un altro (oggetti vuoti, anche i POD consumano almeno 1 byte di memoria).
FYI. Questo non è standard C. In molti compilatori, questo sarebbe un errore in fase di compilazione. –
perché hai bisogno di sapere. Capire questo può aiutarci a rispondere alla domanda. –
Commentando la modifica: sì, in GCC (solo), l'incremento di un puntatore void ne aggiunge uno al valore. Se apprezzi la portabilità del tuo codice, non abusare della libertà che GCC ti offre. È completamente non standard. E GCC ammette tanto con '-std = c99 -pedantic'. –