1、volatile关键字

在C++中,对volatile修饰的对象的访问,有编译器优化上的副作用:

  1. 不允许被编译器优化,提供特殊地址的稳定访问(只从内存中读取)。
  2. 有序性,编译器进行优化时,不能把对volatile对象前面的其他volatile语句放到他后面,反之也不行。也就是说volatile变量间的操作,是不会被编译器交换顺序的。

注意:

在多线程数据同步时,很多人会选择volatile来修饰全局的变量,使得线程同步。其实是不对的。由有序性可得,编译器可能对语句的位置进行交换,使得程序错误。

volatile bool flag = false;

//线程1
while(flag == false){
done();
} //线程2
update(); //语句1
flag = true; //语句2

上述代码中,编译时语句2可能和语句1调换位置,在多线程中,这可能会发生错误。

2、内联函数和宏定义

宏定义由预处理器实现,做一些简单的字符替换。

内联函数(inline)使用时,编译器将使用函数代码替换函数调用,这样就节省了函数调用的时间,但是增加了内存空间。

区别:

  1. 宏定义不能进行数据类型的检查,内联函数可以
  2. 宏定义展开发生在预编译阶段,内联函数展开发生在编译阶段
  3. inline作为类的成员函数可以调用类的对象,宏定义因为是文本替换,不可以

不适合使用内联函数的情况:

  1. 当inline内出现for,while时,函数的运行时间就比函数调用时间多出很多,那么使用inline的效率就很低,相反需要付出内存空间。
  2. inline不能使用递归。
  3. 函数体比较长,会消耗大量内存空间。
  4. 构造函数和析构函数不适合作为内联函数使用,因为编译阶段编译器会往构造和析构函数中额外加很多代码,比如申请/释放内存,初始化成员对象等等,可能代码并不精简。

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的更多相关文章

  1. MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)

    脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...

  2. Orchard part8

    http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-8 定 ...

  3. 翻译「C++ Rvalue References Explained」C++右值引用详解 Part8:Perfect Forwarding(完美转发):解决方案

    本文为第八部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.ht ...

  4. part8 详情页面动态路由以及banner布局

    1.<router-link>标签 a标签就会把里面文字的颜色变掉 那我们可以换一种写法 <router-link tag='li'> //这样vue就会把这个标签渲染成li标 ...

  5. part8 vue内置标签keep-alive对网页性能优化

    我们网页请求时候 我们点击路由切换 可以看network中数据请求 因为每次路由切换都会执行mounted钩子函数 我们这个函数中数据请求 //每次切换路由,页面都会重新渲染 在根组件中使用 路由切换 ...

  6. 浪潮 NF5240M3 ,NP5540M3 服务器安装2008 R2

    1,服务器系统的安装会出现错误的地方一般都是在Raid 卡驱动 略过Raid 卡配置, 具体 http://jingyan.baidu.com/article/ca41422fddfd201eae99 ...

  7. R12_专题知识总结提炼-AR模块

    应收模块简介 应收模块是用来为企业提供应收款管理的模块. 当企业销售一笔商品或者发生其他影响收入和现金的业务的时候,需要在应收模块记账. 本文档以R12为例,11i可参考,只针对简单业务情况考虑,将应 ...

  8. SHELL实现同时操作多个服务器:服务器批量管理

    引言:     1.如果你想知道你所管理的几万台服务器的/home分区使用率是多少.     2.如果你想为你所管理的几万台服务器添加同一个计划任务你该怎么办?     3.如果你想让你所管理的几万台 ...

  9. express-generator安装时出错,最后用VPS解决

    npm install -g express-generator npm ERR! Linux 3.10.0-229.el7.x86_64npm ERR! argv "/usr/local/ ...

随机推荐

  1. 【转】自定义ALV控件的工具条按钮

    1 CLASS lcl_event_receiver DEFINITION DEFERRED. 2 3 DATA: itab TYPE TABLE OF spfli, 4 wa TYPE spfli. ...

  2. 环境配置-Java-01-安装

    本文使用JDK1.8在windows64位系统下举例,其他版本在windows下的安装过程类似 0.百度云盘链接 考虑到官网下载需要登陆,这里给大家提供百度云盘链接(就是官网安装包),不过下载速度会比 ...

  3. 优化太多的if-else

    来源java小当家 第1种方法:提前return,减少else判断 1 // 1.优化前 2 private int handlerPre1(boolean flag) { 3 if(flag){ 4 ...

  4. linux自定义安装位置安装jdk

    注:本文系参考网络内容及本人实践得出 1 下载jdk安装包 下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downl ...

  5. 给HTML页面设置自己的icon

    原因: 不知道为什么,SpringBoot中自动设置icon失效了. 解决方法: 在head标签中添加自己想要使用的icon图片.后缀使用图片格式,不要使用.ico. <link href=&q ...

  6. 免费稳定图床最佳实践:PicGo+GitHub+jsDeliver 极简教程

    一.下载 PicGo PicGo 是啥?顾名思义,它是一个快速上传图片并获取 图片 URL 链接的工具. 目前支持七牛.腾讯云.阿里云和 GitHub 等图床.该工具代码已在 GitHub 开源,读者 ...

  7. 架构风格 vs. 架构模式 vs. 设计模式(译)

    4.架构风格 vs. 架构模式 vs. 设计模式(译) - 简书 https://www.jianshu.com/p/d8dce27f279f

  8. Go Proverbs

    https://github.com/go-proverbs/go-proverbs.github.io Go Proverbs Simple, Poetic, Pithy Don't communi ...

  9. 数位DP笔记

    数位DP 1.定义: 数位dp是一种计数用的dp,一般就是要统计一个区间[L,R]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp: 数位的含义:一个数有个位.十位.百位.千位... ...

  10. 开发环境管理利器Vagrant

    引言 不知道你是否经历过,开发环境与生产环境不一致.Windows开发和Linux上的包效果不一样.在我这运行时好的啊 等等等问题,那有没有解决方法呢? 答案就是Vagrant.Docker 1.简介 ...