std function型別定義與 auto的記憶體占用為什麼是不同的呢?

時間 2021-05-12 21:59:13

1樓:嵐依

因為lambda的型別其實並不是std::function,你做的事情基本上和這個差不多:

autoc=

"H";

std::

strings=

"H"儘管c和s的值都是"H",但是前者是const char*,後者卻是std::string,是兩個完全不同的東西。

同理,實際上lambda並不是std::function,它只是能轉換為std::function而已

2樓:黃亮anthony

前文說的很清楚。因為lambda表示式可以產生可呼叫物件,std::function物件可以儲存閉包。

auto變數是乙個lambda,std::function是乙個儲存了lambda物件的物件。

3樓:sin1080

std::function和lambda不一樣,function是乙個類模板,模板引數是函式簽名,實現的是把任何支援這個簽名的Copyable的Callable物件做個型別擦除(通常還會再做個小物件優化)然後儲存成統一的型別,提供個operator()讓你用統一的方式呼叫,這樣你就可以把很多態別不同但是簽名一樣的東西做成統一的型別、放進同乙個容器,等等。

lambda的型別,連名字都不能說。寫不出來。實際型別是編譯器生成的一種你不能寫名字的型別。

所以只能用auto去做宣告。但是可以肯定的是這個型別肯定不是std::function,裡面結構也不一樣。

4樓:

畢竟lambda和function不是同乙個東西,後者的尺寸更大嘍……

#include

#include

int main()

; std::function f;

std::cout << "lambda sz: " << sizeof(l) << std::endl;

std::cout << "function sz: " << sizeof(f) << std::endl;

return 0;

}輸出:

lambda sz: 1

function sz: 32

而且書上說functions會在堆上分配空間,那麼占用記憶體就更多啦~究其原因,這倆東西本來就是不一樣的型別。而且function提供的功能更多。

auto型別定義多個變數時的指標型別推演?

既然說初始值必須是同一種型別,可是ci和 ci明明不是同一種型別啊!這句是對的。上圖 但是要注意這句話,切記,符號 和 只從屬於某個宣告符,而非基本資料型別的一部分雖然兩者的型別不同,但基本資料型別是相同的,也就符合了那句,因此初始值必須是同一種型別 p ci 和平常的定義沒什麼不同。在一條宣告語句...

std function的引數和作為引數的問題

暮無井見鈴 std function function cppreference.com C concepts Callable 這裡是接收可呼叫物件那個過載。對於 std function 要求是函式物件對於 char 引數型別,和 void 返回型別 可呼叫 根據 Callable 要求。只要函...

C 11的std function作為函式引數時應該以哪種方式傳參?是否要視情況而定?

菊花三弄 如果你是想把function 放容器裡,用常量引用,插入容器的時候拷貝一次。如果你想把function 放到其他執行緒執行,用傳值 歐文韜 第二部分是std function的實現原理所以你就看你的場景能不能接受function的複製代價,不能的話就const reference,最省事 ...