Ne const_cast jamais provoquer l'émission de code réel?
-
09-09-2019 - |
Question
Est-il vrai que const_cast est juste une façon de dire au compilateur « gémissant d'arrêt, traiter comme un pointeur non-const »? Y a-t-il des cas où const_cast est lui-même traduit en code machine réelle?
La solution
On peut imaginer, il pourrait y avoir des architectures où un pointeur const avait une autre représentation à un non-const, auquel cas le compilateur devrait émettre un code. Je ne suis pas au courant de telles architectures, cependant.
Autres conseils
Non, il se contente d'enlever l'attribut const au moment de la compilation.
const_cast jette tout de suite la constness d'un attribut et rien de plus.
const
ne change pas la représentation d'un type, en particulier, la représentation des T*
est exactement la même que T const*
.
Considérez:
int i,
* const cpi = &i,
* const * pcpi = &cpi;
int const * const * pcpci = pcpi; // cpi is now int const*
La représentation des cpi
en même temps représente un int*
et un int const*
via *pcpci
.
Il n'y a aucun moyen pour la représentation de cpi
à changer quand pcpci
est initialisée.
Bien sûr, si les objets pointeur ont des bits non significatifs, le compilateur peut les retourner au hasard; en particulier, const_cast
peut retourner les bits non significatifs d'un pointeur, mais une conversion implicite pourrait aussi. Je ne pense pas que ce existe cas dans le monde réel.
Le même appliquer lorsque deux résultats différents de la même valeur d'adresse motifs de bit (base + offset quand offset est assez grand).