Perché sizeof è chiamato operatore di compilazione?

13

Originariamente, questa è una parte di un'altra domanda.

Perché sizeof ha chiamato un operatore in fase di compilazione? Non è in realtà un operatore run-time? E se è davvero un operatore in fase di compilazione, come aiuta a produrre codice portatile che funziona allo stesso modo su computer diversi? Si prega di spiegare in dettaglio.

    
posta The Peaceful Coder 18.04.2013 - 19:04
fonte

4 risposte

23

sizeof() ti dà la dimensione del tipo di dati , non le dimensioni di una particolare istanza di quel tipo in memoria.

Ad esempio, se si dispone di un oggetto dati stringa che alloca una matrice di caratteri a dimensione variabile in fase di runtime, sizeof() non può essere utilizzato per determinare la dimensione di tale matrice di caratteri. Ti darebbe solo la dimensione del puntatore.

La dimensione di un tipo di dati è sempre nota al momento della compilazione.

    
risposta data 18.04.2013 - 19:06
fonte
13

perché l'intera dimensione della "chiamata" viene calcolata in fase di compilazione e qualsiasi tra le parentesi viene scartata e non eseguita in fase di runtime,

il risultato è puramente basato su informazioni di tipo statico disponibili per il compilatore

    
risposta data 18.04.2013 - 19:40
fonte
7

Why is sizeof called a compile-time operator?

Perché, in fase di compilazione, il compilatore calcola la dimensione dell'espressione e sostituisce il valore della costante in fase di compilazione.

Isn't it actually a run-time operator?

No. Puoi anche usare sizeof per valutare la dimensione delle espressioni che non puoi legalmente eseguire (cioè, ciò comporterebbe un comportamento indefinito), a patto che il compilatore possa capire cosa tipo dell'espressione è.

Inoltre, anche prima del C ++ 11% diconstexpr, puoi usare sizeof espressioni in modi in cui non puoi utilizzare le espressioni di runtime.

And if it is indeed a compile-time operator, how does it help in producing portable code ...

I tipi possono variare in dimensioni su piattaforme diverse. L'utilizzo di espressioni sizeof invece di ipotesi codificate indica che il tuo codice non si interromperà quando compili su una piattaforma diversa e i tuoi tipi cambiano dimensione.

    
risposta data 19.04.2013 - 11:41
fonte
5

C ++ in realtà non memorizza i metadati per gli oggetti in fase di runtime, quindi il controllo delle dimensioni deve essere compilato. Per un esempio di come C ++ non convalida le dimensioni, dichiara un array di int di alcune dimensioni arbitrarie e leggi oltre la fine di esso. Se sei fortunato riceverai un segfault ma più probabilmente ti limiterai a leggere senza senso, perché C ++ non tiene traccia delle dimensioni dell'array.

Vedi Può un programma seg / fault del programma C / C ++ leggere oltre la fine di un array (UNIX)? per un esempio di SO.

    
risposta data 18.04.2013 - 19:36
fonte

Leggi altre domande sui tag