Вызывает ли const_cast реальную эмиссию кода?
-
09-09-2019 - |
Вопрос
Это правда, что const_cast это просто способ сказать компилятору: «Хватит стонать, воспринимайте это как неконстантный указатель»?Бывают ли случаи, когда const_cast сам транслируется в реальный машинный код?
Решение
Вполне возможно, что могут существовать архитектуры, в которых константный указатель имеет представление, отличное от неконстантного, и в этом случае компилятору придется генерировать некоторый код.Однако я не знаю ни одной такой архитектуры.
Другие советы
Нет, он просто удаляет атрибут const во время компиляции.
const_cast просто отбрасывает константность атрибута и не более того.
const
не меняет представление типа, в частности представление T*
точно так же, как T const*
.
Учитывать:
int i,
* const cpi = &i,
* const * pcpi = &cpi;
int const * const * pcpci = pcpi; // cpi is now int const*
Представление cpi
в то же время представляет собой int*
и int const*
с помощью *pcpci
.
Нет возможности представлять cpi
измениться, когда pcpci
инициализируется.
Конечно, если объекты-указатели имеют несущественные биты, компилятор может перевернуть их случайным образом;в частности, const_cast
может перевернуть несущественные биты указателя, но также может и любое неявное преобразование.Я не думаю, что этот случай существует в реальном мире.
То же самое применимо, когда два разных битовых шаблона приводят к одному и тому же значению адреса (база + смещение, если смещение достаточно велико).