![](/img/trans.png)
[英]Passing by value, const value, reference, const reference, pointer, const pointer
[英]“UnConsting” const value via pointer
首先,对于可能的问题冗余感到抱歉。
在 GCC 中使用 C/C++ 指针做一些小实验时,我在绕过指针地址处的值的恒定性时遇到了这种有点奇怪的行为。
#include <iostream>
int main()
{
using namespace std;
const double number = 100;
//bypassing constantess of pointed-to value
double * pointer_to_value = (double *) &number;
*pointer_to_value += 200;
cout << "Adress of number: " << &number << "\tValue of number: " << number << endl <<
" Pointer value: " << pointer_to_value << "\tDereferencing pointer: " << *pointer_to_value;
return 0;
}
我希望这两种形式的检查值都会产生相同的结果。 在这两种情况下,价值的位置是相同的。 程序生成如下 output,然而:
数字地址:0x22ff30 数字值: 100指针值:0x22ff30 解引用指针: 300
有谁能解释一下吗? 提前致谢。
这是未定义的行为。
它为什么会发生无关紧要(实际上是因为编译器内联了该值)。
"UnConsting” const value via pointer
是Undefined Behavior 。
因此,定义标准未定义的行为是不可能的。
编译器优化。 编译器不希望你像那样尝试欺骗它,它知道值是const
,所以它只是缓存了它。 尝试在没有任何优化的情况下编译它,看看它是否有什么不同。
一般const
的含义是:
常量 - 不得修改 object。 尝试这样做会导致未定义的行为。 在大多数编译器上,它是编译时错误。
编译器优化。 您可以通过向变量添加volatile
关键字来克服这个问题。
#include <iostream>
int main()
{
using namespace std;
volatile const double number = 100;
//bypassing constantess of pointed-to value
double * pointer_to_value = (double *) &number;
*pointer_to_value += 200;
cout << "Adress of number: " << &number << "\tValue of number: " << number << endl <<
" Pointer value: " << pointer_to_value << "\tDereferencing pointer: " << *pointer_to_value;
return 0;
}
我的猜测是 gcc 已经代表您进行了一些优化,将<< number
的引用替换为<< 100
。 应该可以通过查看生成的 asm 代码来验证。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.