doconst在运行时有影响

does const has an effect in runtime

本文关键字:有影响 运行时 doconst      更新时间:2023-10-16

前几天,一位C++培训师对我说,"const"只有在编译时(静态)才有意义,因此在运行时没有影响。。。但当我测试这个例子时:

const int x = 5;
int * px = const_cast<int*>(&x);
*px = 10;
std::cout << "x = " << x <<std::endl; // x = 5 ???

x没有用10修改!然而,如果我们使用指针,这个例子可以正常工作:

const int * x = new int(5);
int * px = const_cast<int*>(x);
*px = 10;
std::cout << "x = " << *x <<std::endl; // x = 10

那么,这个C++训练器是错的?

通过const_cast修改const T是未定义的行为。这允许编译器优化您的代码,假设它从未发生过。在您的第一个代码示例中,编译器可能在调用operator<<的过程中在代码中插入了一个文本5

您的第二个例子定义得很好,因为x实际上指向的是int,而不是const int。在这种情况下,去掉const ness是可以的。

去掉最初声明为const的变量的常量是Undefined Behavior

去掉常量指针的const或对非常量变量的引用是可以的,但不建议这样做。

我想不出任何实际派生自C++const关键字的汇编指令,所以我想这部分中没有"运行时"操作,,将变量声明为const可能会向编译器发出信号,要求将变量存储在数据段中,或者直接对汇编代码中的值进行硬编码,而不分配其必要的空间(在堆栈上等)。因此,从常量变量派生的汇编代码可能与从可变变量派生的程序集代码完全不同。

正如其他评论者所提到的,您通过修改最初声明为const的对象,从编译器中调用了未定义的行为。const_castr被设计为去除获得的常量,就像对象被声明为可修改,但作为const引用传递到某个地方一样。

你的代码实际上也与其他东西接壤,这也是非常危险的。你有没有这样定义你的变量:

static const int x = 5;

您的应用程序也可能崩溃。这样做的原因是,像这样声明的变量可能会被放在可执行文件的只读段中,而对这样的段的修改会导致硬件中止。

相关文章: