博客
关于我
【C++常量折叠】改改const试试 _alibaba
阅读量:198 次
发布时间:2019-02-28

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

今天阿里巴巴算法工程师实习生的笔试有这样一道题,问输出啥

#include 
using namespace std;int main(void){ const int a = 10; int * p = (int *)(&a); *p = 20; cout<<"a = "<
<<", *p = "<<*p<
当时我凭感觉觉得——肯定是10,20吧

考完之后尝试了一下编译运行果真如此,但是,很奇怪不是么,*p成20了我懂,但const的地址指向的地方都被改掉了呀,为啥a还是10呢?

于是……到处找找看资料学习下

const volatile int i = 10;  

const int i = 10;  

原来如此,这两个是不一样的,C++中有个东西叫做常量折叠,

《定义》

c++里的常量折叠(或者常量替换)是将const常量放在中,而并不给其分配内存。直接进行替换优化。

嘛,简单的说,就是如果直接 const int i = 10; 和 #define i 10差不多(嘛,微妙的有点区别,不过10也看作是个整型大差不差了)

实际上,在刚刚代码中*p=20的时候,确实const i所在地址的值被改成20了没错,但是会输出10,就是因为这个常量折叠的原因,当加上volatile(易变的)修饰符之后,系统就知道,嗯这个东西善变啊,输出的时候就不是从符号表中提取值而是乖乖从内存去读了,那样一来,就是20咯~~~

P.S》 不是我黑VC++6.0哦……它可能确实……有点老了。在这方面我们凭事实说话……

VS2010中,一切和上述说明一致,

DevC++中,一切和上述说明一致,

VC++6.0中,即便你加了volatile,也和没加一样输出10,20——

虽然定义const变量的同时加上了volatile修饰符,但VC++ 6.0编译器还是进行了优化措施,输出 i 时 从编译器的符号表中取值,直接输出。

const volatile int i = 10;  

const int i = 10;  

转载地址:http://hpwi.baihongyu.com/

你可能感兴趣的文章
MySQL常用日期格式转换函数、字符串函数、聚合函数详
查看>>
MySQL常见函数
查看>>
MySQL常见架构的应用
查看>>
MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)
查看>>
MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)
查看>>
MySQL常见约束条件
查看>>
MySQL常见错误
查看>>
MySQL常见错误分析与解决方法总结
查看>>
mysql并发死锁案例
查看>>
MySQL幻读:大家好,我是幻读,我今天又被解决了
查看>>
MySQL底层概述—1.InnoDB内存结构
查看>>
MySQL底层概述—2.InnoDB磁盘结构
查看>>
MySQL底层概述—3.InnoDB线程模型
查看>>
MySQL底层概述—4.InnoDB数据文件
查看>>
MySQL底层概述—5.InnoDB参数优化
查看>>
MySQL底层概述—6.索引原理
查看>>
MySQL底层概述—7.优化原则及慢查询
查看>>
MySQL底层概述—8.JOIN排序索引优化
查看>>
MySQL底层概述—9.ACID与事务
查看>>
Mysql建立中英文全文索引(mysql5.7以上)
查看>>