<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
先說結論:
lambda
,其等價於物件。lambda
,其等價於函數!首先,很多C++程式設計師從lambda
用法上反推容易發現是物件,因為lambda可以捕獲!這是函數做不到的。的確,比如:
int n = 100; auto foo = [n](int a) { return a > n; }; cout<< foo(99);
如果編譯器要實現foo
,大致類比這種寫法(可能真實的實現細節不是這樣,但思路類似)∶
struct Foo { Foo(int i) {n=i;} bool operator()(int a) { return a > n; } private: int n; }; ... int n = 100; Foo foo(n); cout<< foo(99);
如果是參照捕獲了變數,那麼struct內有一個指標成員持有被參照捕獲的變數的地址。
比如:
set<int> ns = {100, 200, 300}; auto foo = [&ns](int a) { return ns.find(a); }; cout<< foo(99);
大致等價於:
struct Foo { Foo(set<int>* p) {p_ns = p;} bool operator()(int a) { auto &ns = *p-ns; return ns.find(a); } private: set<int>* p_ns; }; ... set<int> ns = {100, 200, 300}; Foo foo(&ns); cout<< foo(99);
然而……這並不是全部!
在沒有捕獲任何東西的時候,lambda
其實是等價於普通的函數的!可以用Linux C中函數pthread_create()來驗證!它只能接收一個引數是void*,返回值也是void*的回撥函數。
神奇的是,無參的lambda
也可以被pthread_create()
使用!
using namespace std; struct A { void* operator()(void*) { cout<<"xxxx"<<endl; return nullptr; } }; int main() { A a; a(NULL); pthread_t t; //pthread_create(&t, NULL, a, NULL); // 編譯失敗 auto cb = [](void*)->void* { cout<<"xxxx"<<endl; return nullptr; }; pthread_create(&t, NULL, cb, NULL); // 編譯通過 pthread_join(t, NULL); return 0; }
上面程式碼還可以再改一下,讓cb去捕獲一個變數, 比如:
auto cb = [&](void*)->void* { cout<<"xxxx"<<endl; return nullptr; }; pthread_create(&t, NULL, cb, NULL);
這時,給pthread_create()傳入cb同樣會編譯失敗!錯誤資訊:
cb.cpp: In function ‘int main()': cb.cpp:23:30: error: cannot convert ‘main()::<lambda(void*)>' to ‘void* (*)(void*)' 23 | pthread_create(&t, NULL, cb, NULL); | ^~ | | | main()::<lambda(void*)> In file included from /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:35, from /usr/include/x86_64-linux-gnu/c++/9/bits/gthr.h:148, from /usr/include/c++/9/ext/atomicity.h:35, from /usr/include/c++/9/bits/ios_base.h:39, from /usr/include/c++/9/ios:42, from /usr/include/c++/9/ostream:38, from /usr/include/c++/9/iostream:39, from cb.cpp:1: /usr/include/pthread.h:200:15: note: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)' 200 | void *(*__start_routine) (void *), | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
這其實也不難理解,C++在lambda的設計上也貫徹著零開銷 (Zero Overhead)原則,也就是C++不在效能上幹多餘的事,顯然函數比物件開銷更小。所以即使同為lambda,在有無捕獲的時候,其底層實現其實是截然不同的!
到此這篇關於論C++的lambda是函數還是物件的文章就介紹到這了,更多相關C++中的lambda內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45