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。
聲明:
本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。
總結
以上是生活随笔為你收集整理的C 常用新特性(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 境外向国内汇款限额?
- 下一篇: 为什么不要买创业板股票?