当前位置: 首页 > news >正文

const类型强制转换之谜

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

  使用C++的各位想必对const都不陌生,在C++中这是个好用的关键字,但是平时使用时却存在一定误区,尤其是当你需要对它强制转型时。

#include<iostream>
int main(){
	using namespace std;
	const int num_a = 9;
	int& p_num_a = const_cast<int&>(num_a);
	p_num_a=1;
	cout << p_num_a << " " << num_a << endl;
	cout << &p_num_a << " " << &num_a << endl;
	
	int num = 9;
	const int num_b = num;
	int& p_num_b = const_cast<int&>(num_b);
	p_num_b = 1;
	cout << p_num_b << " " << num_b << endl;
	cout << &p_num_b << " " << &num_b << endl;	
	return 0;
}

  猜一下答案是什么?

  不知道各位是否有过类似的情况,其实第一种情况相当容易理解,因为C++中的const是常量,而不是C中定义的“值不变的变量”,也就是说C++中的const是没有内存空间的,仅仅是当作字面量处理了,是不是很像define?

  但是为什么会出现第二种情况?让我们先来看一段GAS汇编码。

  对比很容易发现多出了

movl $9 , 24(%esp)              ; num=9

movl 24(%esp) , %eax          ; eax=num

movl %eax , 12(%esp)          ; num_b=num

  可知此时的const由于上述代码,不能再将自己放进符号表,不再具备像define一样的特性,这样就具有了存储空间,因此我们对他修改的值,都在num_b中有直观反映。

  因为C++里的const是内部链接的,所以如果我们使用extern const int num_b也能达到相同的效果。

  有一点需要补充,C里的const也可能出现像C++一样的情况,这个是编译器优化造成的,所以只需要把优化级别降低就行了。

转载于:https://my.oschina.net/codesun/blog/82986

相关文章:

  • 百度地图演示示例
  • C#双缓冲绘图
  • switch命令大全
  • struts2 和 spring整合
  • 什么是md5盐值
  • 自己动手更换近光灯
  • 物理层组件小结
  • 日语学习资料
  • 手动检测网站的SQL注入漏洞
  • 有人黑我们程序员
  • iOS应用程序状态切换相关
  • 十大最佳外国Android游戏下载平台
  • Scala 的学习笔记系列(持续更新中)
  • event.srcElement 和 e.target 用法
  • windows office 界面改进(续)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • egg(89)--egg之redis的发布和订阅
  • flask接收请求并推入栈
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Linux快速复制或删除大量小文件
  • nginx 配置多 域名 + 多 https
  • opencv python Meanshift 和 Camshift
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 基于组件的设计工作流与界面抽象
  • 记一次和乔布斯合作最难忘的经历
  • 简单实现一个textarea自适应高度
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 通过几道题目学习二叉搜索树
  • 小程序开发中的那些坑
  • 一文看透浏览器架构
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 如何用纯 CSS 创作一个货车 loader
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • #微信小程序:微信小程序常见的配置传旨
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (ros//EnvironmentVariables)ros环境变量
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (转) Face-Resources
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET建议使用的大小写命名原则
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /bin/rm: 参数列表过长"的解决办法
  • @Autowired和@Resource的区别
  • @Repository 注解
  • @Transactional 竟也能解决分布式事务?
  • [20140403]查询是否产生日志
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [bzoj1038][ZJOI2008]瞭望塔
  • [BZOJ2850]巧克力王国