亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  C++的lambda是函數還是對象?

C++的lambda是函數還是對象?

時間:2024-02-10

關于C++的lambda是函數還是對象,這其實不是一個一概而論的問題。

先說結論:

  • 對于有捕獲的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 = {100200300};
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 = {100200300};
Foo foo(&ns);
cout<< foo(99);

然而……這并不是全部!

在沒有捕獲任何東西的時候,lambda其實是等價于普通的函數的!可以用Linux C中函數pthread_create()來驗證!它只能接收一個參數是void*,返回值也是void*的回調函數。

神奇的是,無參的lambda也可以被pthread_create()使用!

#include <iostream>
#include <pthread.h>
using namespace std;

struct A {

    voidoperator()(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,在有無捕獲的時候,其底層實現其實是截然不同的!


深入理解glibc malloc:內存分配器實現原理


為什么空類大小是1


C/C++為什么要專門設計個do…while?


推薦一個學習技術的好網站


Linux最大并發數是多少?


累夠嗆!整理了一份C++學習路線圖!


亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美区自拍先锋| 亚洲激情偷拍| 亚洲精品视频一区| 欧美日韩一区二区在线视频| 一区二区三区视频免费在线观看| 国产精品爽爽爽| 久久人人超碰| 亚洲女人av| 亚洲人午夜精品| 国产午夜精品麻豆| 国产精品萝li| 久久久久久久性| 欧美性视频网站| 欧美成人网在线| 久久精品国产在热久久| 99精品国产一区二区青青牛奶| 中文亚洲视频在线| 久久亚洲精品视频| 久久精品91久久久久久再现| 韩国av一区二区三区在线观看| 久久久久亚洲综合| 一区二区三区在线观看欧美| 国产视频精品网| 亚洲一区二区三区视频| 欧美成人一区二区三区片免费| 国产精品理论片| 亚洲性感美女99在线| 女人色偷偷aa久久天堂| 亚洲福利视频网站| 亚洲国产精品视频一区| 国产一区二区福利| 国语自产精品视频在线看一大j8| 国产精品亚洲美女av网站| 国产在线不卡精品| 一区二区三区黄色| 免费不卡在线观看av| 国产一区91精品张津瑜| 日韩一级裸体免费视频| 欧美激情91| 亚洲香蕉伊综合在人在线视看| 欧美日韩亚洲三区| 极品少妇一区二区三区精品视频| 国产亚洲精品v| 日韩一级免费| 久久久亚洲国产天美传媒修理工| 国产精品女主播| 国产一区二区主播在线| 一区二区三区国产精品| 欧美在线视频观看| 欧美日韩综合网| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲毛片播放| 日韩视频不卡| 午夜精品久久久久久久99水蜜桃 | 国产精品对白刺激久久久| 欧美国产精品一区| 一区二区三区四区在线| 欧美亚洲网站| 亚洲福利国产| 国产精品久久久久久久久久免费看| 国产精品影片在线观看| 欧美日韩亚洲一区| 亚洲一区二区三区免费观看| 亚洲激情另类| 麻豆91精品91久久久的内涵| 葵司免费一区二区三区四区五区| 精品动漫一区| 欧美一级播放| 欧美日韩国产在线播放网站| 欧美精品日韩综合在线| 欧美在线观看一区二区三区| 一区二区三区欧美亚洲| 亚洲欧美综合v| 亚洲一区二区三区在线| 国产精品久久九九| 欧美一区二区三区免费在线看| 国产一区二区剧情av在线| 国产精品成人一区二区三区吃奶| 欧美成人伊人久久综合网| 理论片一区二区在线| 久久久91精品国产一区二区三区| 久久久一区二区| 久久精品九九| 欧美日韩成人网| 亚洲第一精品电影| 国产在线精品自拍| 亚洲一区二区视频在线| 久久久免费观看视频| 欧美三级资源在线| 99精品国产高清一区二区| 91久久综合| 韩国av一区二区三区在线观看| 欧美日韩一区三区四区| 久久精品一二三区| 亚洲精品一二三区| 欧美激情一区二区三区蜜桃视频 | 99热免费精品| 国产日韩av一区二区| 国产日韩欧美一区二区三区四区 | 国产一区二区欧美| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 伊人成人开心激情综合网| 亚洲三级国产| 亚洲欧美日本精品| 久久精品国产亚洲5555| 欧美一级视频| 欧美va亚洲va香蕉在线| 久久亚洲精品伦理| 免费在线国产精品| 欧美精品三级日韩久久| 欧美在线播放高清精品| 国产一区二区三区久久精品| 欧美视频在线观看一区| 91久久精品国产91性色tv| 老司机67194精品线观看| 国产一区二区成人| 亚洲欧美日韩在线| 国产欧美日韩综合一区在线播放| 99视频在线观看一区三区| 欧美日韩国产限制| 欧美亚洲视频| 欧美成人自拍视频| 在线观看视频一区二区欧美日韩| 欧美午夜视频在线| 欧美综合国产| 午夜精品久久一牛影视| 在线观看国产日韩| 欧美在线免费一级片| 欧美视频中文在线看| 亚洲精品国产精品国产自| 亚洲欧美日韩国产中文| 免费久久99精品国产自| 夜夜嗨av一区二区三区| 激情综合网激情| 久久久九九九九| 暖暖成人免费视频| 国产精品久久久久久妇女6080 | 午夜免费在线观看精品视频| 午夜精品美女自拍福到在线 | 99精品热视频| 国产精品久久毛片a| 久久精品亚洲一区二区| 一本高清dvd不卡在线观看| 国产区在线观看成人精品| 欧美激情女人20p| 久久久91精品国产一区二区三区| 一本色道久久综合精品竹菊| 国内精品久久久久久影视8| 欧美日韩国产经典色站一区二区三区| 六月婷婷一区| 亚洲综合色在线| 亚洲国产高潮在线观看| 国产精品视频一区二区高潮| 欧美精品一区二区三区一线天视频 | 国产午夜精品久久久久久免费视| 欧美国产高潮xxxx1819| 久久精品国产一区二区电影| 亚洲私人影院| 亚洲九九九在线观看| 国产亚洲毛片在线| 欧美日韩一区二区高清| 欧美a级片网站| 久久三级福利| 性欧美1819性猛交| 亚洲制服av| 9色国产精品| 亚洲美女诱惑| 在线成人h网| 黄色免费成人| 好看的日韩视频| 国产日韩成人精品| 国产伦精品一区二区三区在线观看| 欧美色图天堂网| 欧美日韩视频专区在线播放| 欧美激情视频给我| 欧美黑人在线观看| 欧美激情网友自拍| 欧美大片va欧美在线播放| 欧美 日韩 国产精品免费观看| 久久偷看各类wc女厕嘘嘘偷窃| 亚欧成人在线| 久久精品国产91精品亚洲| 欧美一区日韩一区| 久久av老司机精品网站导航 | 麻豆九一精品爱看视频在线观看免费| 欧美一区二区三区四区视频| 在线亚洲美日韩| 欧美成年人视频| 国产欧美精品日韩| 美女网站久久| 亚洲私拍自拍| 亚洲影院色无极综合| 亚洲在线视频免费观看| 亚洲影视综合| 午夜精品久久久久影视| 欧美一区视频| 久久一二三四| 欧美精品尤物在线| 国产精品乱码一区二区三区| 国产区亚洲区欧美区|