Perché sizeof è chiamato operatore di compilazione?


12

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

Perché viene sizeofchiamato un operatore in fase di compilazione? Non è in realtà un operatore di runtime? E se è davvero un operatore in fase di compilazione, in che modo aiuta a produrre codice portatile che funziona allo stesso modo su computer diversi? Si prega di spiegare in dettaglio.


4
ha risposto in dettaglio a SO: Perché sizeof (x ++) non incrementa x?
moscerino del

3
Come prevedete che la dimensione di un tipo cambi in fase di esecuzione?

@MichaelT: Le dimensioni di un'istanza di un tipo possono certamente cambiare - dopo tutto c'è il polimorfismo di classe. Direi che sizeof(polymorphic_ptr*)essere costanti è abbastanza controintuitivo e sciocco. Sì, è il modo C ++, ma sciocco comunque.
Ripristina Monica il

@KubaOber Indeed. Sono solo curioso di sapere come l'OP abbia pensato che dovesse comportarsi in diversi casi e spero di ottenere un codice che dimostrasse la sua confusione su questo per aiutare a espandere la domanda.

4
È venuto a votare la risposta "perché funziona in fase di compilazione", rimasto deluso.
Ben Jackson,

Risposte:


23

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

Ad esempio, se si disponeva di un oggetto dati stringa che ha allocato una matrice di caratteri di dimensioni variabili in fase di esecuzione, sizeof()non è stato possibile utilizzare 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.


3
Poiché C (++) non ha metadati di oggetti in fase di esecuzione, non è possibile ottenere tali elementi in fase di esecuzione.
C. Ross,

5
In realtà, se si utilizza sizeofsu un array, si sarà ottenere la dimensione della matrice (che è i tempi dimensione di elemento il numero di elementi). Ma se lo usi su un puntatore, otterrai solo la dimensione del puntatore. Pertanto, poiché nella maggior parte dei casi in cui si desidera conoscere le dimensioni di un array, si dispone solo di un puntatore, non è poi così utile.
sepp2k,

1
@Jens La domanda è taggata [C ++] e VLA non è entrata nello standard C ++.
authchir,

13

poiché l'intera dimensione della "chiamata" viene calcolata in fase di compilazione e tutto ciò che si trova tra parentesi viene scartato e non eseguito in fase di esecuzione,

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


7

Perché sizeof è chiamato operatore di compilazione?

Perché, al momento della compilazione, il compilatore calcola la dimensione dell'espressione e sostituisce il valore costante del tempo di compilazione.

Non è in realtà un operatore di runtime?

No. Puoi anche usare sizeofper valutare la dimensione delle espressioni che non puoi eseguire legalmente (cioè, ciò comporterebbe un comportamento indefinito), a condizione che il compilatore possa capire quale sia il tipo di espressione.

Inoltre, anche prima di C ++ 11 constexpr, è possibile utilizzare le sizeofespressioni in modi in cui non è possibile utilizzare le espressioni di runtime.

E se è davvero un operatore in fase di compilazione, in che modo aiuta a produrre codice portatile ...

I tipi possono variare di dimensioni su piattaforme diverse. L'uso delle sizeofespressioni anziché delle ipotesi codificate significa che il codice non si interromperà quando si compila su una piattaforma diversa e i tipi cambiano dimensione.


1
Bene, trovo questa la risposta più utile;). Fratello (supponendo che tu sia maschio), ho dei dubbi. Intendi dire che quando le persone dicono che sizeof rende i programmi portatili, significano che il codice sorgente può essere compilato senza errori in tutte le macchine e non significa che il programma eseguibile può essere eseguito in qualsiasi macchina. Giusto ? Se questo è giusto, il mio dubbio viene chiarito.
The Peaceful Coder,

1
Sì, il codice è portatile, nel senso che puoi compilare un binario (diverso) corretto per ogni piattaforma.
Inutile

5

C ++ in realtà non memorizza i metadati per gli oggetti in fase di esecuzione, quindi il controllo delle dimensioni deve essere il tempo di compilazione. Per un esempio di come C ++ non convalida la dimensione, dichiarare un array di intdimensioni arbitrarie e leggere oltre la fine. Se sei fortunato otterrai un, segfaultma più probabilmente leggerai semplicemente senza senso, perché C ++ non tiene traccia delle dimensioni del tuo array.

Vedere Un programma C / C ++ può seg-fault dalla lettura oltre la fine di un array (UNIX)? per un esempio da SO.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.