doconst在运行时有影响
does const has an effect in runtime
前几天,一位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;
您的应用程序也可能崩溃。这样做的原因是,像这样声明的变量可能会被放在可执行文件的只读段中,而对这样的段的修改会导致硬件中止。
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 在实践中,在运行时为零的乘法中是否有任何"lazy"评估
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 运行时错误:有符号整数溢出:964632435 * 10 无法在类型 'int' 中表示
- 给定的两个代码有什么区别.一个在 ideone 上运行时超出时间限制,另一个工作正常
- Windows 并发运行时任务计划,但有例外
- 是否有一种方法可以在运行时停止循环重复一次不止一次
- 是否有任何可能的方法将事件(自定义)附加到在运行时创建的对象?[C 构建器]
- 对于具有固定运行时确定大小的数组,是否有标准C++类?
- 每当我的程序运行时,使用SRAND(TIME(NULL))都会给出相同的输出(不在循环中,播种有足够大的值)
- GSL 的预期 (cond) 对运行时施加的性能影响是什么?
- 是否有一种简单的方法可以在运行时在C 中创建/名称对象
- 有条件地定义在运行时,在C 代码的其余部分中将使用3类
- 有没有办法在运行时编译C++代码
- 是否有一种方法可以在运行时识别变量的const修饰符
- 这个C++代码有什么问题?它在运行时崩溃
- 如何在运行时检查 c++11 元组是否有可能的函数应用程序
- Microsoft Visual C 可再发行组件包和运行时包之间有什么区别
- 有没有更好的方法来处理将标识分配给层次结构中的类以供运行时使用
- 是否有任何运行时断言,如:内存是只读的还是当前进程可访问的