博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转载】关于const与volatile笔试题目的分析
阅读量:5163 次
发布时间:2019-06-13

本文共 1092 字,大约阅读时间需要 3 分钟。

源自 

昨天笔试遇到了关于c++中关于const与const_cast的题目,大概如下:

int main(int argc, char* argv[]){
const int a = 10; int * p = const_cast
(&a); *p = 1; printf("%d %d\n", a, *p); return 0;}

求上述程序的输出结果,正确答案是:10 1

分析如下:

首先可以确定是p和&a的地址是指向同一片内存区域的,理论上来说最后的输出结果应该是1 1

但是为什么会输出a的值为10呢? 猜测应该是const关键字的问题,可能编译器看到a为const型变量,所以在编译期就将所有的a直接替换为10了,这个是编译器做的一个优化,
下面简单的验证下:
直接使用下面的命令来看下编译后的汇编代码,关键部分的汇编如下:

movl    %edi, -20(%rbp)        movq    %rsi, -32(%rbp)        movl    $10, -12(%rbp)        leaq    -12(%rbp), %rax        movq    %rax, -8(%rbp)        movq    -8(%rbp), %rax        movl    $1, (%rax)        movq    -8(%rbp), %rax        movl    (%rax), %edx        movl    $10, %esi        movl    $.LC0, %edi        movl    $0, %eax        call    printf        movl    $0, %eax        leave        ret

显然%rax中存放的指针p的值,(%rax)代表间接寻址

在调用printf函数之前,将10放入%esi, (%rax)放入到%edx中,显然验证了上述的猜想

关于volatile关键字

如何避免编译器做这方面的优化呢?

一个常用的方法是将变量a加上关键字volatile,代表是”易变,每次都需要从内存中读取,这样上述程序的运行结果就是1 1了
当然修改常量变量的值不是好的编程习惯,尽量还是少用上述用法

转载于:https://www.cnblogs.com/lovemdx/archive/2012/11/14/2769425.html

你可能感兴趣的文章
B. An express train to reveries(Round 418)
查看>>
不要逼孩子考100分
查看>>
Python(四)
查看>>
Symbols of String Pattern Matching
查看>>
如何判断一个人的能力
查看>>
【学习笔记】 狄利克雷与莫比乌斯
查看>>
关于 DataRow 中为 DataRowState.Deleted 状态的 字段列值取值方法
查看>>
724.Find Pivot Index
查看>>
小牛必会之—monkey
查看>>
python3.6.3安装步骤,适用linux centos系统
查看>>
没有终结点在侦听可以接受消息的*这通常是由于不正确的地址或者 SOAP操作导致的...
查看>>
HTML5---15.网络接口
查看>>
接收xml请求流并解析字符串的例子
查看>>
中文字符串分隔的注意问题
查看>>
zip打包是去掉路径
查看>>
常用的经典jquery代码[转]
查看>>
正则判断
查看>>
转--RTP如何打包H264数据
查看>>
IOC及AOP实现原理
查看>>
CocoaPods安装和使用教程
查看>>