C 的std thread是怎麼進行引數傳遞的?

時間 2021-06-01 20:50:08

1樓:小島上的做題家

當你建立乙個thread的時候,引數傳遞是分兩步的,先傳給std::thread,再傳給函式。

std::thread的constructor把你的引數copy到新的thread的memory space裡。這時所有的引數都被複製了,以rvalue的形式存在於新的thread的memory space裡。

這時呼叫你傳進去的函式,你函式所有的引數用的都是在新的memory space裡的rvalue。

現在再看你的4個例子,

第乙個例子,

(1) s被copy到了新的memory space裡去,所以call的是copy constructor 輸出了1。

(2) 第一步的結果生成了乙個rvalue,所以傳引數去函式的時候用的是move constructor,所以輸出了2。

第二個例子,

(1) s被move到了新thread的memory space裡,所以用的是move constructor,輸出2。

(2) 同上,輸出2。

第三個例子你說錯了,這裡輸出的不是1,而是0.

你輸出的是這個String(const char* cstr) 。

(1) 你在這裡copy過去的其實是乙個const char*所以第一步沒任何輸出。

(2) 這時你用const char*來構造乙個String,所以輸出0.

第四個例子,你的一切活動都是指向最初的那個s,所以沒有任何constructor被呼叫,所以不輸出任何東西。

其實可以追問你乙個問題,如果你的函式是void test(int i, String& s) {},也就是說String ref沒有const,為什麼你必須用std::ref不然無法compile,因為std::thread預設copy,mutable ref不可以bind到在新的memory space上的rvalue上。

2樓:

thread 是模板,引數的形式是所謂的 forwarding reference(或 universal reference),所以傳參給 thread 的建構函式時,如果引數是左值,則引數被 copy 到內部,如果傳的引數是右值,則 move,無論如何 thread 內部都(暫時)保留了引數的乙個 copy,然後內部傳給使用者的函式時,直接 move.

C 的 sizeof 是怎麼實現的?

ddlau 1 b應該等於sizeof std ptrdiff t 通常這個值是4或者8 2 姑且不說實現,C 標準要求不對用作sizeof alignof decltype typeid noexcept運算元的表示式求值 我剛才說的noexcept不是noexcept specification...

為什麼C語言用printf 列印數值的十進位制 八進位制 十六進製制時,有時會擴充套件到32位有時不會?

暮無井見鈴 傳遞引數給省略號形參時,會經過 整型提公升 對於 char short 等 短於 int 的型別,如果能轉換到 int 且值不改變則轉換到 int 否則轉換到 unsigned int 浮點提公升 float 轉換到 double 問題裡的程式不涉及 這裡程式存在未定義行為。因為 fpr...

男生進女生房間是怎麼樣的體驗?

lightshao 沒進去之前,可能你會覺得很刺激,有種莫名的感覺,不是緊張,但就是有一種感覺存在,等進去之後,有時候你可能就匆匆離開了,也有可能會覺得她們的寢室真整齊或者也是一樣的普通,甚至會覺得比男生寢室還亂,最後收拾心情,離開。 熊貓不是貓 第一次去女朋友房間的感覺是 亂的很有章法!真的是我第...