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。

声明:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ant 路径_在Ant中显示路径

ant 路径在博客文章Java and Ant Properties Refresher和Ant <echoproperties /> Task中 &#xff0c;我写了一篇关于如何了解Ant构建如何看到属性的文章&#xff0c;这有助于更好地理解该构建。 通常情况下&#xff0c;在构建过程中看到构建中使用的各种路径也很有价值&…

c语言中结束本次循环的语句是什么

c语言中结束本次循环的语句是“continue”。控制语句continue只能作用于循环体中&#xff0c;其作用是结束本次循环&#xff0c;跳到判断循环的位置&#xff0c;即重新开始下一次循环。在C语言中&#xff0c;控制语句“continue”用于循环体中结束本次循环&#xff0c;重新开始…

C语言中要改变循环语句的流程可以使用的语句有哪些

C语言中要改变循环语句的流程可以使用的语句有&#xff1a;break&#xff0c;continue和goto。break语句可以终止循环而执行整个循环语句后面的代码&#xff1b;continue语句可以跳过循环体中剩余的语句而强制进入下一次循环。break关键字当 break 关键字用于 while、for 循环时…

apk图标存放位置_安卓系统下安装完apk程序后,具体的文件夹位置在哪里呢?

展开全部 有的程序的文件夹是自动建立在sd卡上的,有的程序是没有文件夹的,程序位于32313133353236313431303231363533e59b9ee7ad9431333365666238date/app文件夹内,而系统的程序位于system/app文件夹内。 软件安装完成后,就会在date/app目录出现一个apk文件。 这个文件相当…

continue语句只用于循环语句中,它的作用是什么?

continue语句只用于循环语句中&#xff0c;它的作用是&#xff1a;跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在while、for循环中&#xff0c;常与if条件语句一起使用&#xff0c;判断条件是否成立。continue语句只用在while、for循环中&#xff0c;它的作…

在c语言中引用数组元素时,其数组下标的数据类型允许是什么

在c语言中引用数组元素时&#xff0c;其数组下标的数据类型允许是&#xff1a;整型常量或整型表达式。C语言规定只能逐个引用数组元素而不能一次引用整个数组&#xff0c;数据元素的表示形式为“数组名[下标]”&#xff0c;下标可以是整型常量或整型表达式。数组中只有一维数组…

在c语言中char型数据在内存中的储存形式为什么

在c语言中char型数据在内存中的储存形式为“ASCII码”。在C语言中&#xff0c;将一个字符常量放到一个字符变量中&#xff0c;实际并不是把该字符本身放到内存单元中&#xff0c;而是将与该字符相对应的ASCII码放到存储单元中。c语言 char型字符型数据类型就是字符1、字符数据的…

集合相减算法java_集算器协助java处理结构化文本的集合运算

有两个小文件&#xff1a;f1.txt和f2.txt&#xff0c;第一行是列名&#xff0c;现在需要对文件中的Name字段进行交集运算。部分数据如下&#xff1a;文件f1.txt:文件f2.txt:集算器代码&#xff1a;A1、B1&#xff1a;用import函数将文件读[A1.(Name),B1.(Name)].isect()入内存&…

netbeans插件_如何编写NetBeans插件

netbeans插件是否想在NetBeans IDE中添加功能或自动执行某些操作&#xff1f; 跟随我们编写您的第一个NetBeans插件。 让我们超越简单的工具栏示例 &#xff0c;创建一个可以自动更新的插件。 该代码基于NetBeans的WakaTime插件 。 我们的示例插件将仅打印Hello World语句&…

c语言程序从哪里开始执行

c语言程序的执行总是起始于main函数。在一个C语言源程序中&#xff0c;无论main函数书写在程序的前部&#xff0c;还是后部&#xff0c;程序的执行总是从main函数开始&#xff0c;并且在main函数中结束。但需要注意的是&#xff0c;也是有特殊情况的&#xff0c;若是代码中出现…

基于价值链的流程框架分类_基于价值的类

基于价值链的流程框架分类在Java 8中&#xff0c;某些类在Javadoc中有一个小注释&#xff0c;说明它们是基于值的类 。 其中包括简短说明的链接&#xff0c;以及有关不使用它们的限制。 这很容易被忽略&#xff0c;如果这样做&#xff0c;则可能会在将来的Java版本中以微妙的方…

C语言中数组所占字节怎么算

数组在内存中所占字节数可以使用sizeof操作符来计算&#xff0c;该操作符是专门用于检测类型或变量或数组在内存中所占有的空间&#xff08;字节数&#xff09;&#xff1b;语法“sizeof(x)”&#xff0c;其中x是类型名、变量名或数组名等&#xff0c;可以返回x所占字节数。C语…

c 中头文件和源文件的区别是什么

区别&#xff1a;头文件是“.h”文件&#xff0c;提供接口&#xff1b;源文件是“.cpp”文件&#xff0c;提供实现。编译器规定源文件必须包含函数入口&#xff0c;即main函数&#xff1b;而头文件不得包含函数入口&#xff0c;头文件不可以单独编译成一个程序&#xff0c;仅仅…

rest api_REST API的演变

rest api每个开发人员都以某种方式接触到API 。 要么为一家大公司集成一个主要系统&#xff0c;或者使用最新的图形库生成一些精美的图表&#xff0c;要么直接与他喜欢的编程语言进行交互。 事实是&#xff0c;API无处不在&#xff01; 它们实际上代表了当今Internet的基本构建…

在c程序中,注释语句只能位于一条语句的后面吗

C语言中的注释在编写C语言源代码时&#xff0c;应该多使用注释&#xff0c;这样有助于对代码的理解。在C语言中有两种注释方式&#xff1a;一种是以/*开始、以*/结束的块注释&#xff08;block comment&#xff09;&#xff1b;另一种是以//开始、以换行符结束的单行注释&#…

C 运算符中不能重载的是哪些

C 运算符中不能重载的有&#xff1a;1、条件运算符“?:”&#xff1b;2、成员访问运算符“.”&#xff1b;3、域运算符“::”&#xff1b;4、长度运算符“sizeof”&#xff1b;5、成员指针访问运算符“->*”和“.*” 。重载&#xff1a;让操作符可以有新的语义&#xff0c;…

C语言字符串输出函数puts()的作用是什么

C语言字符串输出函数puts()的作用&#xff1a;puts()在显示字符串时会自动在其末尾添加一个换行符。puts()遇到空字符时就停止输出&#xff0c;所以必须确保有空字符。  下面两个示例分别说明puts()的两个特点。  示例1&#xff1a;/* put_out.c -- using puts() */#includ…

maf中anglearc_Oracle MAF中的LOV

maf中anglearc我们都喜欢最强大的ADF功能值列表之一。 使用它们&#xff0c;我们可以声明并轻松地在ADF应用程序中构建非常复杂的功能。 一件好事是&#xff0c;我们在Oracle MAF中也有类似的方法。 在ADF BC中&#xff0c;我们在业务服务级别&#xff08;基本上在实体或VO级别…

一个c程序的执行是从哪里开始到哪里结束

一个C程序的执行是从main函数开始到main函数结束。C语言是一门面向过程的、抽象化的通用程序设计语言&#xff0c;广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语…

java9 coutdown_Java并发之CountDownLatch

正如每个Java文档所描述的那样&#xff0c;CountDownLatch是一个同步工具类&#xff0c;它允许一个或多个线程一直等待&#xff0c;直到其他线程的操作执行完后再执行。在Java并发中&#xff0c;countdownlatch的概念是一个常见的面试题&#xff0c;所以一定要确保你很好的理解…