const_cast是否会导致实际的代码发射?

8

请问const_cast只是告诉编译器“别唠叨了,把这个指针当做非const处理”吗?是否存在const_cast本身被翻译成实际的机器代码的情况?

4个回答

12

不,它只是在编译时去除const属性。


5

可以想象,可能存在某些架构中,const指针与非const指针具有不同的表示方式,这种情况下编译器需要发出一些代码。但是我并不知道有这样的架构。


1
我特意没有说编译器什么时候需要生成一些代码。 - anon
1
完全没有关系。const_cast将删除指针中的假设“只读位”,通过const指针对可变成员的写入也会产生相同效果。编译器可以100%准确地检测到后者。 - MSalters
“在某些架构中,一个常量指针可能具有不同于非常量指针的表示形式。” - curiousguy
@MSalters "_const_cast将删除指针中假设的“只读位”_”这个位根本不存在,无论如何。 - curiousguy
1
@curiousguy:这个陈述正是所质疑的地方。如果您有证据,请将其添加为答案。 - MSalters
显示剩余2条评论

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

当初始化pcpci时,cpi的表示方式不会改变。

当然,如果指针对象有非重要位,编译器可以随机翻转它们;特别地,const_cast可以翻转指针的非重要位,但是任何隐式转换也可能发生。我不认为这种情况存在于现实世界中。

当两个不同的比特模式导致相同的地址值(基址加偏移量时,偏移量足够大)时,同样适用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接