请问const_cast只是告诉编译器“别唠叨了,把这个指针当做非const处理”吗?是否存在const_cast本身被翻译成实际的机器代码的情况?
请问const_cast只是告诉编译器“别唠叨了,把这个指针当做非const处理”吗?是否存在const_cast本身被翻译成实际的机器代码的情况?
不,它只是在编译时去除const属性。
可以想象,可能存在某些架构中,const指针与非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
。
当初始化pcpci
时,cpi
的表示方式不会改变。
当然,如果指针对象有非重要位,编译器可以随机翻转它们;特别地,const_cast
可以翻转指针的非重要位,但是任何隐式转换也可能发生。我不认为这种情况存在于现实世界中。
当两个不同的比特模式导致相同的地址值(基址加偏移量时,偏移量足够大)时,同样适用。