2009-04-17 7 views
7

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

+1

Да, это правда. – user51568

ответ

5

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

+0

Умный, но не правдоподобный: только const - это атрибут, это не значит, что вы не можете писать (считайте изменяемые члены). Если вы задумываетесь о архитектуре, где указатели только для чтения и чтения и записи или только для записи различны, тогда код все равно не будет генерироваться при произведении, а не в самой записи. – Suma

+1

Я намеренно не сказал _when_ компилятор должен был бы испустить некоторый код. – 2009-04-17 08:08:00

+1

Неважно. Const_cast woud удаляет гипотетический «бит только для чтения» в указателе, который записывает в изменяемый элемент через указатель const. Последний может быть обнаружен с помощью 100% -ной точности компилятором. – MSalters

12

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

3

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

2

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

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