多线程

什么是多线程这里就不过多介绍,新特性关于多线程最主要的就是std::thread的使用,它的使用也很简单,看代码:

这里记住,std::thread在其对象生命周期结束时必须要调用join()或者detach(),否则程序会terminate(),这个问题在C 20中的std::jthread得到解决,但是C 20现在多数编译器还没有完全支持所有特性,先暂时了解下即可,项目中没必要着急使用。

左值右值移动语义相关

大家可能都听说过左值右值,但可能会有部分读者还没有搞清楚这些概念。这里解惑下:

关于左值和右值,有两种方式理解:

概念1:

左值:可以放到等号左边的东西叫左值。

右值:不可以放到等号左边的东西就叫右值。

概念2:

左值:可以取地址并且有名字的东西就是左值。

右值:不能取地址的没有名字的东西就是右值。

举例来说:

a是左值,有变量名,可以取地址,也可以放到等号左边, 表达式b c的返回值是右值,没有名字且不能取地址,&(b c)不能通过编译,而且也不能放到等号左边。

左值一般有:

  • 函数名和变量名

  • 返回左值引用的函数调用

  • 前置自增自减表达式 i、--i

  • 由赋值表达式或赋值运算符连接的表达式(a=b, a = b等)

  • 解引用表达式*p

  • 字符串字面值"abcd"

介绍右值前需要先介绍两个概念:纯右值和将亡值。

运算表达式产生的临时变量、不和对象关联的原始字面量、非引用返回的临时变量、lambda表达式等都是纯右值。例如:

  • 除字符串字面值外的字面值

  • 返回非引用类型的函数调用

  • 后置自增自减表达式i 、i--

  • 算术表达式(a b, a*b, a&&b, a==b等)

  • 取地址表达式等(&a)

而将亡值是指C 11新增的和右值引用相关的表达式,通常指将要被移动的对象、T&&函数的返回值、std::move函数的返回值、转换为T&&类型转换函数的返回值,将亡值可以理解为即将要销毁的值,通过“盗取”其它变量内存空间方式获取的值,在确保其它变量不再被使用或者即将被销毁时,可以避免内存空间的释放和分配,延长变量值的生命周期,常用来完成移动构造或者移动赋值的特殊任务。例如:

std::file_system

C 17正式将file_system纳入标准中,提供了关于文件的大多数功能,基本上应有尽有,这里简单举几个例子:

file_system之前,想拷贝个文件、获取文件信息等都需要使用好多C语言API搭配使用才能完成需求,而有了file_system,一切都变得相当简单。file_system是C 17才引入的新功能,但其实在C 14中就可以使用了,只是file_system在std::experimental空间下。

std::chrono

chrono很强大,也是我常用的功能,平时的打印函数耗时,休眠某段时间等,我都是使用chrono。

在C 11中引入了duration、time_point和clocks,在C 20中还进一步支持了日期和时区。这里简要介绍下C 11中的这几个新特性。

Rep表示一种数值类型,用来表示Period的数量,比如int、float、double,Period是ratio类型,用来表示【用秒表示的时间单位】比如second,常用的duration已经定义好了,在std::chrono::duration下:

  • ratio<3600, 1="">:hours

  • ratio<60, 1="">:minutes

  • ratio<1, 1="">:seconds

  • ratio<1, 1000="">:microseconds

  • ratio<1, 1000000="">:microseconds

  • ratio<1, 1000000000="">:nanosecons

ratio的具体模板如下:

clocks

时钟,chrono里面提供了三种时钟:

steady_clock

system_clock

high_resolution_clock

steady_clock

稳定的时间间隔,表示相对时间,相对于系统开机启动的时间,无论系统时间如何被更改,后一次调用now()肯定比前一次调用now()的数值大,可用于计时。

system_clock

表示当前的系统时钟,可以用于获取当前时间:

high_resolution_clock

high_resolution_clock表示系统可用的最高精度的时钟,实际上就是system_clock或者steady_clock其中一种的定义,官方没有说明具体是哪个,不同系统可能不一样,我之前看gcc chrono源码中high_resolution_clock是steady_clock的typedef。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

C 常用新特性(下)相关推荐

  1. 【SQL开发实战技巧】系列(四十五):Oracle12C常用新特性☞VARCHAR2/NVARCHAR2类型最大长度由4000字节扩展到32767字节

    系列文章目录 文章目录 系列文章目录 前言 Oracle12C常用新特性☞VARCHAR2/NVARCHAR2类型最大长度由4000字节扩展到32767字节 案例一:CDB+PDB环境启用扩展 案例二 ...

  2. 【SQL开发实战技巧】系列(四十七):Oracle12C常用新特性☞非分区表在线转分区表online clause(不停业务+索引有效)

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  3. rhel6系统中,mysql 5.6复制新特性下主从复制配置[基于GTID]

    1.mysql5.6在复制方面的新特性: (1).支持多线程复制:事实上是针对每个database开启相应的独立线程,即每个库有一个单独的(sql thread).针对这样的改进,如果我们想实现多线程 ...

  4. C#: 8.0 和 9.0 常用新特性

    在<带你了解C#每个版本新特性> 一文中介绍了,C# 1.0 到 7.0 的不同特性,本文接着介绍在 8.0 和 9.0 中的一些常用新特性. C# 8.0 在 dotNET Core 3 ...

  5. JDK1.8新特性及常用新特性

    JDK1.8的新特性 *Lambda表达式 新的日期API--Date time 引入Optional--防止空指针异常 *接口的默认方法和静态方法 *新增方法引用格式 *新增Stream类 注解相关 ...

  6. Java8常用新特性详解

    文章目录 Java8新特性纵览 Lambda表达式 为什么使用Lambda表达式? 简单使用 Lambda语法规则 函数式接口 什么是函数式(Functional)接口 如何理解函数式接口 Java内 ...

  7. JDK1.8,Java8常用新特性

    A.Lamdba表达式 1.Java8概述 Java8,也就是jdk1.8,是意义深远的一个新版本 是Java5之后一个大的版本升级,让Java语言和库仿佛获得了新生 新特性包含: a.随着大数据的兴 ...

  8. php7.1函数,PHP7.1常用新特性和函数

    在php7发布了之后,官方又紧接着发布了php7.1.php7.2,我们也接着使用了新版本.接下来就说说7.1有那些新的特性. Nullable types 在7的时候,如果使用了强类型就必须传递或者 ...

  9. C 常用新特性(上)

    下面是正文: auto类型推导 auto可以让编译器在编译器就推导出变量的类型,看代码: 利用auto可以通过=右边的类型推导出变量的类型. 什么时候使用auto呢?简单类型其实没必要使用auto,然 ...

最新文章

  1. selenium工具的安装
  2. android端使用http2.0,android Retrofit2+okHttp3使用总结
  3. Matter App提供了一个由BCH推动的长格式博客平
  4. Python 计算机视觉(二) —— OpenCV 基础
  5. Python中的数值类型
  6. python Logging日志记录模块详解
  7. css固定在右中间位置,css布局,左右固定中间自适应实现
  8. 不愧是击溃服务器的男人!周杰伦《说好不哭》刷新QQ音乐单曲纪录
  9. 【DIOCP开源项目】实际应用案例
  10. pytorch笔记-实现一个图像分类模型
  11. Android 编程下 Using ViewPager for Screen Slides
  12. 大数据-Hive开窗函数
  13. 计算机速录水平考试,汉字速录水平测试(速录证考试报名网站)
  14. GeekTool使用备忘
  15. Excel2010 count,countif,countifs使用
  16. springboot 整合mybatis plus
  17. 服装企业在实践中探索
  18. The Shawshank Redemption-10
  19. Android无法打开相册查看视频
  20. Vidyo提供的云化视频会议与传统的视频会议有什么区别?

热门文章

  1. javase11源码文件_JavaSE 7,8:确定特定文件系统支持的视图
  2. java集合根据值排序_Java 8:对集合中的值进行排序
  3. Java Iterator到Java 8 Stream
  4. java ee cdi_Java EE CDI依赖注入(@Inject)教程
  5. xstream xml模板_XStream – XStreamely使用Java中的XML数据的简便方法
  6. Spring Boot和Thymeleaf:重新加载模板和静态资源,而无需重新启动应用程序
  7. JLBH示例4 – QuickFix vs ChronicleFix基准化
  8. 定制Hamcrest Matchers
  9. 收到有关RabbitMQ集群分区的通知
  10. 自定义汇编程序,Weaver和运行时的可插拔知识