Вызывает ли const_cast фактическую эмиссию кода? - PullRequest
8 голосов
/ 17 апреля 2009

Правда ли, что const_cast - это просто способ сказать компилятору "прекратить стонать, трактовать это как неконстантный указатель"? Есть ли случаи, когда const_cast сам переводится в фактический машинный код?

Ответы [ 4 ]

12 голосов
/ 17 апреля 2009

Нет, он просто удаляет атрибут const во время компиляции.

5 голосов
/ 17 апреля 2009

Возможно, могут существовать архитектуры, в которых указатель const имеет представление, отличное от неконстантного, и в этом случае компилятор должен будет генерировать некоторый код. Однако я не знаю ни одной такой архитектуры.

3 голосов
/ 17 апреля 2009

const_cast просто отбрасывает постоянство атрибута и ничего более.

2 голосов
/ 20 июля 2012

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 может перевернуть незначащие биты указателя, но любое неявное преобразование также может. Я не думаю, что этот случай существует в реальном мире.

То же самое применяется, когда две разные битовые комбинации приводят к одному и тому же значению адреса (база + смещение, когда смещение достаточно велико).

...