C 常用新特性(下)

多线程

什么是多线程这里就不过多介绍,新特性关于多线程最主要的就是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。

声明:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值