博客
关于我
【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/

你可能感兴趣的文章
Navicat因导入的sql文件中时间数据类型有参数而报错的原因(例:datetime(3))
查看>>
Navicat如何连接MySQL
查看>>
navicat怎么导出和导入数据表
查看>>
Navicat通过存储过程批量插入mysql数据
查看>>
Navicat(数据库可视化操作软件)安装、配置、测试
查看>>
ndk特定版本下载
查看>>
NDK编译错误expected specifier-qualifier-list before...
查看>>
Neat Stuff to Do in List Controls Using Custom Draw
查看>>
Necurs僵尸网络攻击美国金融机构 利用Trickbot银行木马窃取账户信息和欺诈
查看>>
NeHe OpenGL教程 07 纹理过滤、应用光照
查看>>
NeHe OpenGL教程 第四十四课:3D光晕
查看>>
Neighbor2Neighbor 开源项目教程
查看>>
neo4j图形数据库Java应用
查看>>
Neo4j图数据库_web页面关闭登录实现免登陆访问_常用的cypher语句_删除_查询_创建关系图谱---Neo4j图数据库工作笔记0013
查看>>
Neo4j图数据库的介绍_图数据库结构_节点_关系_属性_数据---Neo4j图数据库工作笔记0001
查看>>
Neo4j安装部署及使用
查看>>
Neo4j电影关系图Cypher
查看>>
Neo4j的安装与使用
查看>>
Neo4j(2):环境搭建
查看>>
Neo4j(4):Neo4j - CQL使用
查看>>