È vero che const_cast è solo un modo per dire al compilatore "smetti di lamentarti, considera questo come un puntatore non const"? Ci sono casi in cui const_cast stesso viene tradotto nel codice macchina attuale?Il const_cast causa mai emissione di codice effettiva?
risposta
In teoria, potrebbero esserci architetture in cui un puntatore const ha una rappresentazione diversa rispetto a uno non const, nel qual caso il compilatore dovrebbe emettere del codice. Tuttavia, non sono a conoscenza di tali architetture.
Intelligente, ma non vero: const è solo un attributo, non significa che non puoi scrivere (considera i membri mutabili). Se si sta progettando un'architettura in cui i puntatori di sola lettura e di lettura-scrittura o di sola scrittura sono diversi, il codice non verrà comunque generato nel cast, piuttosto nella scrittura stessa. – Suma
Non ho intenzionalmente detto _quando_ il compilatore avrebbe dovuto emettere del codice. –
Non ha importanza. Il const_cast rimuove l'ipotetico "bit di sola lettura" nel puntatore, così come scrive su un membro mutabile tramite un puntatore const. Quest'ultimo può essere rilevato con il 100% di acidità dal compilatore. – MSalters
No, rimuove solo l'attributo const al momento della compilazione.
const_cast getta via solo la costanza di un attributo e nient'altro.
const
non modifica la rappresentazione di un tipo, in particolare, la rappresentazione di T*
è esattamente la stessa di T const*
.
consideri:
int i,
* const cpi = &i,
* const * pcpi = &cpi;
int const * const * pcpci = pcpi; // cpi is now int const*
La rappresentazione cpi
allo stesso tempo rappresenta un int*
e int const*
via *pcpci
.
Non è possibile modificare la rappresentazione di cpi
quando viene inizializzato pcpci
.
Ovviamente, se gli oggetti del puntatore hanno bit non significativi, il compilatore può capovolgerli casualmente; in particolare, const_cast
può capovolgere i bit non significativi di un puntatore, ma anche qualsiasi conversione implicita. Non penso che questo caso esista nel mondo reale.
Lo stesso si applica quando due diversi schemi di bit generano lo stesso valore di indirizzo (base + offset quando l'offset è sufficientemente grande).
Sì, è vero. – user51568