在cpp中创建一个变量const然后将其地址提供给一个指针,但取消引用不会改变变量,为什么?
在 cpp 中创建一个变量 const 然后将它的地址提供给一个指针并通过取消引用来更改它的值,但我仍然得到我最初存储的值。
代码片段
const int a = 5;
// then
// a = 7; not possible
// bypassing const using pointers
int *ap = (int *)&a;
*ap = 10;
cout << *ap <<" "<< *(&a)<<" " << a << endl;
输出是:
10 10 5
回答
任何修改声明的变量或成员的程序const都具有不再由 C++ 标准定义的行为。
这被称为UB。UB 的常见症状是崩溃、“它似乎可以工作”、奇怪的不一致状态,甚至时间旅行,其中未来的 UB在代码中发生之前改变行为。
一个好的 C++ 程序员的习惯使 UB 不太可能。
您在此处看到的 UB 的症状是,由于 C++ 标准指定的行为没有任何程序const int x=5;可以具有除 之外的任何值5,因此编译器将 read to 替换x为常量5。
另一方面,您可以形成一个指向 的指针x,并且x那里确实有字节。编译器可以自由地放入xROM 或受保护的页面,或者它可以不打扰并将其放入普通内存中。
你形成一个指向x. 编译器不会忽略此指针(允许,但也不允许),因此在您的机器代码中,它实际上会读取和写入x存储地址处的数据。因此*&x是10同时X is5 . What more, *&X could be5`如果编译器优化指针程。
避免UB。
C++ 定义了一个抽象机器,C++ 程序在它上面定义了行为(除非你做 UB)。然后将其转换为保证与抽象机器行为一致的机器代码,但根本无法保证天真地看起来“应该”映射到某些机器代码的 C++ 代码确实如此。
抽象和具体之间的差距允许进行大量优化。
C++ 抽象机器行为旨在轻松映射到机器代码,而 UB 则留在执行某些行为会产生成本的地方。
THE END
二维码