C++ part8
1、volatile关键字
在C++中,对volatile修饰的对象的访问,有编译器优化上的副作用:
- 不允许被编译器优化,提供特殊地址的稳定访问(只从内存中读取)。
- 有序性,编译器进行优化时,不能把对volatile对象前面的其他volatile语句放到他后面,反之也不行。也就是说volatile变量间的操作,是不会被编译器交换顺序的。
注意:
在多线程数据同步时,很多人会选择volatile来修饰全局的变量,使得线程同步。其实是不对的。由有序性可得,编译器可能对语句的位置进行交换,使得程序错误。
volatile bool flag = false;
//线程1
while(flag == false){
done();
}
//线程2
update(); //语句1
flag = true; //语句2
上述代码中,编译时语句2可能和语句1调换位置,在多线程中,这可能会发生错误。
2、内联函数和宏定义
宏定义由预处理器实现,做一些简单的字符替换。
内联函数(inline)使用时,编译器将使用函数代码替换函数调用,这样就节省了函数调用的时间,但是增加了内存空间。
区别:
- 宏定义不能进行数据类型的检查,内联函数可以
- 宏定义展开发生在预编译阶段,内联函数展开发生在编译阶段
- inline作为类的成员函数可以调用类的对象,宏定义因为是文本替换,不可以
不适合使用内联函数的情况:
- 当inline内出现for,while时,函数的运行时间就比函数调用时间多出很多,那么使用inline的效率就很低,相反需要付出内存空间。
- inline不能使用递归。
- 函数体比较长,会消耗大量内存空间。
- 构造函数和析构函数不适合作为内联函数使用,因为编译阶段编译器会往构造和析构函数中额外加很多代码,比如申请/释放内存,初始化成员对象等等,可能代码并不精简。
3、Lambda
lambda表达式在其所在的位置上定义了一个匿名函数对象。
lambda表达式的形式:
[捕获值列表] (函数参数) mutable / exception -> 返回值类型 {函数体}
捕获值列表:分为值捕获,引用捕获。捕获的参数是我们能直接在函数体中使用的参数。和一般的函数不同的是,值捕获的值是在lambda创建时捕获的,也就是说在lambda创建后再改变值不会改变lambda内的捕获的值。
//example1
int a = 1;
auto fun = [a](){ return a; };
a = 11;
std::cout << fun(); //1
//example2
int a = 1;
auto fun = [&a](){ return a; };
a = 11;
std::cout << fun(); //11
函数参数:表示匿名函数的参数。
返回值类型:return的类型,void可以忽略。
函数体:函数的主体。
参考资料:
谈谈 C/C++ 中的 volatile
C++之Lambda表达式
C++ part8的更多相关文章
- MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)
脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...
- Orchard part8
http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-8 定 ...
- 翻译「C++ Rvalue References Explained」C++右值引用详解 Part8:Perfect Forwarding(完美转发):解决方案
本文为第八部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.ht ...
- part8 详情页面动态路由以及banner布局
1.<router-link>标签 a标签就会把里面文字的颜色变掉 那我们可以换一种写法 <router-link tag='li'> //这样vue就会把这个标签渲染成li标 ...
- part8 vue内置标签keep-alive对网页性能优化
我们网页请求时候 我们点击路由切换 可以看network中数据请求 因为每次路由切换都会执行mounted钩子函数 我们这个函数中数据请求 //每次切换路由,页面都会重新渲染 在根组件中使用 路由切换 ...
- 浪潮 NF5240M3 ,NP5540M3 服务器安装2008 R2
1,服务器系统的安装会出现错误的地方一般都是在Raid 卡驱动 略过Raid 卡配置, 具体 http://jingyan.baidu.com/article/ca41422fddfd201eae99 ...
- R12_专题知识总结提炼-AR模块
应收模块简介 应收模块是用来为企业提供应收款管理的模块. 当企业销售一笔商品或者发生其他影响收入和现金的业务的时候,需要在应收模块记账. 本文档以R12为例,11i可参考,只针对简单业务情况考虑,将应 ...
- SHELL实现同时操作多个服务器:服务器批量管理
引言: 1.如果你想知道你所管理的几万台服务器的/home分区使用率是多少. 2.如果你想为你所管理的几万台服务器添加同一个计划任务你该怎么办? 3.如果你想让你所管理的几万台 ...
- express-generator安装时出错,最后用VPS解决
npm install -g express-generator npm ERR! Linux 3.10.0-229.el7.x86_64npm ERR! argv "/usr/local/ ...
随机推荐
- 跨平台导PDF,结合wkhtmltopdf很顺手
前言 好东西要分享,之前一直在使用wkhtmltopdf进行pdf文件的生成,常用的方式就是先安装wkhtmltopdf,然后在程序中用命令的方式将对应的html生成pdf文件,简单而且方便:但重复的 ...
- 7行代码解决P1441砝码称重(附优化过程)
先贴上最终代码感受一下: #include <bits/stdc++.h> using namespace std; int i, N, M, wi[21], res = 0; int m ...
- linux设备注册
一.分配cdev cdev表示字符设备,使用cdev_alloc函数,cdev_alloc函数原型如下: /** * cdev_alloc() - allocate a cdev structure ...
- 2021/1/20随记,MTU
背景: 事情是这样的,客户2台防火墙部署了ipsec,内网互通,但是其中ssh以及其他大命令之类的操作就会卡住,简单的vi命令可以使用. 解决: 排除网络问题,因为内网互通,其次是系统层面问题,最终定 ...
- 开源AwaitableCompletionSource,用于取代TaskCompletionSource
1 TaskCompletionSource介绍 TaskCompletionSource提供创建未绑定到委托的任务,任务的状态由TaskCompletionSource上的方法显式控制,以支持未来的 ...
- 重磅:保姆级Java技术图谱发布!够学到元宵节了,赶紧收藏!
最近因为参与社群交流的时间比较多,除了唠唠白酒的嗑之外,很大一部分时间都是看到群里问到一些关于Spring Boot和Spring Cloud应用过程中碰到的问题以及一些开发过程中的报错信息.在这些帮 ...
- c 越界 数组越界
int main(int argc, char* argv[]){ int i = 0; int arr[3] = {0}; for(; i<=3; i++){ arr[i] = 0; prin ...
- Python学习【第9篇】:python中的局部变量与全局变量
1.全局变量 全局变量定义后可被下面所有函数进行调用 例子: name = "xiao"def chang_name(): print("chang_name" ...
- 系列trick - 随机
系列trick - 随机 不断更新中,欢迎来提供idea 随机的字符串 出现次数 \(\ge 2\) 的子串期望长度是 \(\log n\) 两个随机串的期望LCP,LCSuf,LCSub长度是 \( ...
- HTML5 使用浏览器内置数据库之 indexedDB
indexedDB是H5规范里的浏览器内置数据库,是nosql数据库的一种.因为另一种数据库Web SQL不再受W3C支持,所以还得学习下这个. 基本情况 兼容性:ie11及以上都支持, W3C是这么 ...