【知识点】 C++寄存器优化
作者:李春港
出处:https://www.cnblogs.com/lcgbk/p/14502076.html
一、前言
在c++中什么情况下,当我们定义一个常量时,编译器都做了哪些操作呢?首先让我们看下一节的程序。
二、代码实例
#include<iostream>
using namespace std;
int main ()
{
int const tmp = 100; //定义常量tmp tmp不能修改
int const* p = &tmp; //不能通过指针修改指向的值
int* const q = const_cast<int*>(p); //去常属性 可以通过指针修改指向的内容
*q = 200;
cout << tmp << " " << *p << " " << *q << endl; //打印变量的值
cout << &tmp << endl << p << endl << q << endl; //打印变量地址
return 0;
}
看了以上程序你觉得结果会是怎么样呢?
结果:
100
200
200
00556820
00556820
00556820
到这里你会发现:为什么怎么地址一样,但值却不一样呢?
我们就相当于和编译器约定好了,我们不会去修改 tmp 的值,这个时候编译器就会做一个优化,将 tmp 的值,放到寄存器里面,然后读取 tmp 时直接在寄存器里面读取,加快读取速度。
所以出现以上情况是因为:tmp 读取的是「寄存器」的值,p ,q读取的是「内存」的值。
三、volatile作用
以上实例出现的情况,有时候我们并不希望这样的情况出现,然而 volatile 可以为我们去除这样的优化,使用该关键字,相当于告诉编译器,这个关键字修饰的变量要到内存里面去操作,不要直接从寄存器取值。
优化代码如下:
volatile int const tmp2 = 100;
volatile int const* pm = &tmp2; //不能通过指针修改指向的值
int* const qm = const_cast<int*>(pm); //q本身只读 指向读写
*qm = 200;
cout << tmp2 << " " << *pm << " " << *qm << endl;
cout << (void*)&tmp2 << endl << (void*)pm << endl << qm << endl;
打印结果:
200
200
200
00666820
00666820
00666820
这样就不会出现地址一样,数值不一样的情况了,也是我们希望看到的结果。
【知识点】 C++寄存器优化的更多相关文章
- Object-C知识点 (四) 性能优化
#pragma mark - 性能优化 1. 行高一定要缓存 缓存行高是解决性能优化的最佳途径(除非刷新频率已经很高了,否则一定要缓存)2. 尽量减少计算,所有需要素材提前计算好3. 控件不要设置圆角 ...
- Nginx基础知识点总结和优化项
1.什么是Nginx? Nginx是一个高性能的HTTP和反向代理服务器,常用于做负载均衡服务器 2.为什么要用Nginx?跨平台.配置简单非阻塞.高并发连接:处理2-3万并发连接数,官方监测能支持5 ...
- EntityFramework 知识点与sql优化汇总
一.EntityFramework modelBuilder.Entity<Domain.UseOilPlanDetail>().HasRequired(x => x.MainOil ...
- FPGA优化之高扇出
Fanout即扇出,模块直接调用的下级模块的个数,如果这个数值过大的话,在FPGA直接表现为net delay较大,不利于时序收敛.因此,在写代码时应尽量避免高扇出的情况.但是,在某些特殊情况下,受到 ...
- 优化C++程序编译效率的一些方法
优化是一件非常重要的事情.作为一个程序设计者,你肯定希望自己的程序既小又快.DOS时代的许多书中都提到,“某某编译器能够生成非常紧凑的代码”,换言之,编译器会为你把代码尽可能地缩减,如果你能够正确地使 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化
本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的,代码方面,整合了druid数据源也开启 ...
- crm作业知识点集合[二]
知识点1 前面我们实现了这个功能,就是在models中如果有了choice选项,我们可以实现在页面显示这个chocice的value值,而不是key值,我们这个知识点就是在优化一下这个点 首先如果表中 ...
- 汇编 EAX,EBX,ECX,EDX,寄存器
知识点: 寄存器EAX 寄存器AX 寄存器AH 寄存器AL 一.EAX与AX,AH,AL关系图 一格表示一字节 #include <Windows.h> int _tmain(int ar ...
- Innodb性能优化之参数设置
现在,Innodb是Mysql最多使用的存储引擎.其性能一直广受关注.本文通过基本的参数设置来提高其性能. innodb_buffer_pool_size 缓冲池大小.这是innodb参数中最重要的设 ...
随机推荐
- CF1459-C. Row GCD
CF1459-C. Row GCD 题意: 给出两个整数序列\(a.b\),他们的长度分别为\(n,m\).对于数组\(b\)中的每个数字,让你求出\(gcd(a_1+b_j,a_2+b_j,..., ...
- Docker架构分解
Docker总架构分解Docker对使用者来讲是一个C/S模式的架构,而Docker的后端是一个非常松耦合的架构,模块各司其职,并有机组合,支撑Docker的运行. 用户是使用Docker Clien ...
- Linux-源码安装及FPM打包
目录 源码安装 制作RPM包(使用FPM工具) 安装rpm后要执行的脚本(优化版) 源码安装 这里举例Nginx的源码安装,需要前往Nginx官网找到稳定版本源码安装包下载. ## 源码安装nginx ...
- VS中使用TreeView的Checked属性问题
VS中使用TreeView,当需要用到Checked属性,并需要同步子节点和父节点的Checked属性时,若使用AfterCheck事件会导致死循环,这里我使用的是NodeMouseClick事件.代 ...
- Linux Bash Script loop
Linux Bash Script loop shell 编程之流程控制 for 循环.while 循环和 until 循环 for var in item1 item2 ... itemN do c ...
- 手把手搭建一套私有 npm 服务
手把手搭建一套私有 npm 服务 gnpm xnpm pnpm lnpm refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- HTML5 动效
HTML5 动效 motion graphics toolbelt for the web https://github.com/xgqfrms/mojs A collection of loadin ...
- js webpack打包时保留指定注释
optimization: { minimizer: [ new TerserJSPlugin({ terserOptions: { format: { comments: /(\s*#if)|(\s ...
- js 动态修改页面文本字体
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 亿级流量客户端缓存之Http缓存与本地缓存对比
客户端缓存分为Http缓存和本地缓存,使用缓存好处很多,例如减少相同数据的重复传输,节省网络带宽资源缓解网络瓶颈,降低了对原始服务器的要求,避免出现过载,这样服务器可以更快响应其他的请求 Http缓存 ...