[转]关于const与volatile笔试题目的分析…vilatile 是去除优化
2012-03-08 12:51
253 查看
关于const与volatile笔试题目的分析
小计录:今天转么对 以下代码上机实验:
const_cast前后的内存地址是一样,只不过 &a是常指针,而转换后的是一般指针。,
关键点是: 编译器看到const ,在编译时就把所有引用const 变量的地方替换了。
所以第一次使用const的地方才分配内存!!(只分配一次内存的还有引用)
2012年3月8日12:49:53 by 66
昨天笔试遇到了关于c++中关于const与const_cast的题目,大概如下:
点击隐藏CPP CODE
int main(int argc, char* argv[])
{
const int a = 10;
int * p = const_cast<int *>(&a);
*p = 1;
printf("%d %d\n", a, *p);
return 0;
}
求上述程序的输出结果,正确答案是:10 1
分析如下:
首先可以确定是p和&a的地址是指向同一片内存区域的,
理论上来说最后的输出结果应该是1 1
但是为什么会输出a的值为10呢?猜测应该是const关键字的问题,可能编译器看到a为const型变量,所以在编译期就将所有的a直接替换为10了,这个是编译器做的一个优化,
下面简单的验证下:
直接使用下面的命令来看下编译后的汇编代码,关键部分的汇编如下:
点击隐藏ASM CODE
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了
当然修改常量变量的值不是好的编程习惯,尽量还是少用上述用法
相关文章推荐
- 【转载】关于const与volatile笔试题目的分析
- 【转载】关于const与volatile笔试题目的分析
- 关于const和volatile
- 关于.NET的笔试题目
- 关于一些初级ACM竞赛题目的分析和题解(五)。
- Python 开发工具集:关于文档、测试、调试、程序的优化和分析
- 关于UITableView的性能优化(历上最全面的优化分析) ...
- 巨人笔试一道关于多态的题目
- 一百度笔试题目分析
- 微软2013暑期实习笔试题目第5题分析
- 一个关于的指针的经典笔试题目,加上自己的一点体会
- 关于C++中的const的简单反汇编分析
- 关于Web前端开发,附:(百度web前端笔试面试题目)
- 关于UITableView的性能优化(历上最全面的优化分析)
- 效能分析 爆打团队 题目去重功能代码优化
- c语言学习笔记(3)const和volatile以及const volatile int i=0分析
- 一道关于java线程中断的题目,求大神指导,昨晚的阿里巴巴笔试题
- 嵌入式编程中关于const,static,extern,volatile的用法
- 关于const,static,extern,volatile的用法
- volatile与const综合分析