c 11常用特性

2021-09-22 21:19:06 字數 2590 閱讀 1583

目錄

一、atomic

1、std::atomic_flag

2、 std::atomic

二、std::thread

三、std::condition_variable

四、右值引用

五、std::function、std::bind

六、lambda表示式

atomic_flag 一種簡單的原子布林型別,只支援兩種操作,test-and-set 和 clear。

std::atomic_flag 只有預設建構函式,拷貝建構函式已被禁用

atomic_flag_init: 如果某個 std::atomic_flag 物件使用該巨集初始化,那麼可以保證該 std::atomic_flag 物件在建立時處於 clear 狀態。

test_and_set() :檢查 std::atomic_flag 標誌,如果 std::atomic_flag 之前沒有被設定過,則設定 std::atomic_flag 的標誌,並返回先前該 std::atomic_flag 物件是否被設定過,如果之前 std::atomic_flag 物件已被設定,則返回 true,否則返回 false。

clear():清除 std::atomic_flag 物件的標誌位,即設定 atomic_flag 的值為 false。

由此可以構造乙個簡單的鎖

std::atomic_flag lock = atomic_flag_init;   //clear 狀態  

while (lock.test_and_set()); //返回false,同時設定atomic_flag的標誌,之後其

/* */ //他執行緒呼叫此函式都返回true

lock.clear(); //重置為 clear 狀態,其他執行緒開始搶占

std::atomic為c++11封裝的原子資料型別。

先上張圖:

以上就是支援的資料型別。

原子操作好像是在彙編上實現的,所以速度要比各種鎖快上不少(好像)

除此之外,還可以進行std::atomic模板類使物件操作為原子操作。

#include #include using namespace std;

void fun1()

很明顯,無法通過編譯。

error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'|

引用是變數的別名,使用常量初始化引用是錯誤的。

當然,我們可以通過新增const來進行初始化,但不能對其的值進行修改。

右值引用:

int main()

;a fun()

int main()

fun()返回的右值本來在表示式語句結束後,其生命也就該終結了(因為是臨時變數),而通過右值引用,該右值又重獲新生,其生命期將與右值引用型別變數a的生命期一樣,只要a還活著,該右值臨時變數將會一直存活下去。實際上就是給那個臨時變數取了個名字。

舉個栗子:

#include #include using namespace std;

class a

auto fun = std::bind(add, std::placeholders::_1, std::placeholders::_2);

fun1(3, 1);

其中fun的型別就是function。

[capture list] (params list) mutable exception-> return type
capture list:捕獲外部變數列表

params list:形參列表

mutable指示符:用來說用是否可以修改捕獲的變數

exception:異常設定

return type:返回型別

function body:函式體

其中[capture list]:

1.[var]表示值傳遞方式捕捉變數var;

2.[=]表示值傳遞方式捕捉所有父作用域的變數(包括this);

3.[&var]表示引用傳遞捕捉變數var;

4.[&]表示引用傳遞方式捕捉所有父作用域的變數(包括this);

5.[this]表示值傳遞方式捕捉當前的this指標。

int main()

; fun(1,2);

return 0;

}/** output: 3 **/

c 11 特性學習

auto 含義改變,現為自動型別推斷 register c 11之前為建議使用cpu暫存器儲存變數,現在幾乎沒有意義 include include include include include include using namespace std initial intsum initiali...

C 11新特性學習

lambda表示式用於建立匿名的函式物件,語法為 函式可訪問的的外部變數 函式引數 返回值型別 如 int a 1,b 2 int c b int x int b 表示函式中可以訪問外部變數b,而且引數b是按值傳遞,b 表示引數b是按引用傳遞,表示可以訪問所有外部變數,並且是用按值傳遞方式,類似,也...

C 11 新特性試用

在c 11之前,auto關鍵字用來指定儲存期。在新標準中,它的功能變為型別推斷。auto現在成了乙個型別的佔位符,通知編譯器去根據初始化 推斷所宣告變數的真實型別。各種作用域內宣告變數都可以用到它。例如,名空間中,程式塊中,或是for迴圈的初始化語句中。auto i 42 i is an int a...