欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++?如何將Lambda轉換成函數(shù)指針

 更新時間:2022年11月05日 11:16:44   作者:斗酒神僧  
這篇文章主要介紹了C++?如何將Lambda轉換成函數(shù)指針,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

沒有捕獲任何變量的Lambda表達式可以轉換成與它的調用原型一致的函數(shù)指針。

參考下面的代碼

void example1()
{
? ? auto add = [](int x, int y)
? ? {
? ? ? ? return x + y;
? ? };
? ? int x = 2, y = 3;
? ? int z1 = add(x, y); ? ? ? ? ? ? ? ? ?// 調用Lambda
? ? int(*f)(int, int) = add; ? ? ? ? ? ? // Lambda轉換成函數(shù)指針
? ? int z2 = f(x, y); ? ? ? ? ? ? ? ? ? ?// 調用函數(shù)
? ? cout << z1 << ", " << z2 << endl;
}

Lambda是實現(xiàn)了函數(shù)調用運算符的匿名類(anonymous class)。對于每一個Lambda,編譯器創(chuàng)建匿名類,并定義相應的數(shù)據成員存儲Lambda捕獲的變量。沒有捕獲變量的Lambda不包含任何含成員變量。

一個沒有任何成員變量(包括沒有虛函數(shù)表指針)的類型,在空指針上調用成員函數(shù)也不會有任何的問題,因為它的成員函數(shù)不會通過this指針訪問內存。

當Lambda向函數(shù)指針的轉換時,編譯器為Lambda的匿名類實現(xiàn)函數(shù)指針類型轉換運算符。

上面的例子中,編譯器實現(xiàn)operator int(*)(int, int)。

下面是Visual C++編譯器為語句int(*f)(int, int) = add生成的64位匯編代碼:

lea ? ? ? ? rcx,[add] ?
call ? ? ? ?<lambda_0e153cdea67ea404383c23c1022dd325>::operator int (__cdecl*)(int,int)?
mov ? ? ? ? qword ptr [f],rax ?

第1行,變量"add"的地址存入rcx寄存器;第2行,調用匿名類的函數(shù)指針類型轉換運算符;第3行,返回結果存入變量f。

提示:在默認的成員函數(shù)調用約定__thiscall下,this指針通過rcx寄存器傳遞, 有關__thiscall的詳細內容,請參考:https://docs.microsoft.com/en-us/cpp/cpp/thiscall。

下面是類型轉換運算符實現(xiàn)的一行關鍵匯編代碼

lea ? ? ? ? rax,[<lambda_0e153cdea67ea404383c23c1022dd325>::<lambda_invoker_cdecl>]?

這一行把匿名類的名為lambda_invoker_cdecl的函數(shù)地址存入用于返回結果的寄存器rax。因為只有類的靜態(tài)函數(shù)可以轉換成非成員函數(shù)指針,所以lambda_invoker_cdecl是靜態(tài)函數(shù)。下面是此函數(shù)其中一段匯編代碼:

xor ? ? ? ? rcx,rcx ?
call ? ? ? ?<lambda_0e153cdea67ea404383c23c1022dd325>::operator()?

第一行,rcx寄存器清0,即this指針置0;第二行,調用operator()。

綜合上面的分析,得出Lambda轉換成函數(shù)指針的一種可能的實現(xiàn)方式,參考下面的代碼:

typedef int(*FUNCADD)(int, int);

// 實現(xiàn)兩個整數(shù)相加的函數(shù)對象
class add_function_object
{
public:
? ? // 函數(shù)調用運算符
? ? int operator()(int x, int y)const
? ? {
? ? ? ? return x + y;
? ? }
? ? // 函數(shù)指針類型轉換運算符
? ? operator FUNCADD()const
? ? {
? ? ? ? return add;
? ? }
private:
? ? static int add(int x, int y)
? ? {
? ? ? ? add_function_object* obj = nullptr;
? ? ? ? return obj->operator()(x, y);
? ? }
};

void example2()
{
? ? int x = 2, y = 3;
? ? add_function_object add;
? ? int z1 = add(x, y);
? ? auto fadd = add.operator FUNCADD();
? ? int z2 = fadd(x, y);
? ? cout << z1 << ", " << z2 << endl;
}

從C++17起,沒有捕獲任何變量的Lambda可以用作值類型模板實參,參考下面的代碼:

typedef int (*INTEGER_OPERATION)(int, int);

int do_integer_operation(INTEGER_OPERATION op, int x, int y)
{
? ? return op(x, y);
}

template <INTEGER_OPERATION op>
int integer_operation_t(int x, int y)
{
? ? return op(x, y);
}

void example3()
{
? ? auto add = [](int x, int y)
? ? {
? ? ? ? return x + y;
? ? };
? ? auto sub = [](int x, int y)
? ? {
? ? ? ? return x - y;
? ? };
? ? int z1 = integer_operation_t<add>(2, 3);
? ? int z2 = do_integer_operation(integer_operation_t<sub>, 2, 3);
? ? cout << "z1 : " << z1 << ", z2 : " << z2 << endl;
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C++實例分析講解臨時對象與右值引用的用法

    C++實例分析講解臨時對象與右值引用的用法

    對性能來說,許多的問題都需要和出現(xiàn)頻率及本身執(zhí)行一次的開銷掛鉤,有些問題雖然看似比較開銷較大,但是很少會執(zhí)行到,那也不會對程序有大的影響;同樣一個很小開銷的函數(shù)執(zhí)行很頻繁,同樣會對程序的執(zhí)行效率有很大影響。本章中作者主要根據臨時對象來闡述這樣一個觀點
    2022-08-08
  • C語言實現(xiàn)的猴子分桃問題算法解決方案

    C語言實現(xiàn)的猴子分桃問題算法解決方案

    這篇文章主要介紹了C語言實現(xiàn)的猴子分桃問題算法,較為詳細的分析了猴子分桃問題算法的原理與通過遞歸算法解決問題的相關實現(xiàn)技巧,需要的朋友可以參考下
    2016-10-10
  • C語言實現(xiàn)簡單的三子棋小游戲

    C語言實現(xiàn)簡單的三子棋小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的三子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 淺談C++ 虛函數(shù)分析

    淺談C++ 虛函數(shù)分析

    這篇文章主要介紹了淺談C++ 虛函數(shù)分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C++實現(xiàn)FTP綜合應用詳解

    C++實現(xiàn)FTP綜合應用詳解

    這篇文章主要為大家詳細介紹了C++實現(xiàn)FTP綜合應用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言實現(xiàn)掃雷小游戲的示例代碼

    C語言實現(xiàn)掃雷小游戲的示例代碼

    這篇文中主要為大家詳細介紹了如何利用C語言實現(xiàn)經典的掃雷小游戲。掃雷小游戲主要是利用字符數(shù)組、循環(huán)語句和函數(shù)實現(xiàn),感興趣的小伙伴可以了解一下
    2022-10-10
  • 基于Qt實現(xiàn)簡單的計算器

    基于Qt實現(xiàn)簡單的計算器

    這篇文章主要介紹了如何使用Qt框架實現(xiàn)一個簡單的計算器應用,我們將使用C++編程語言和Qt的圖形用戶界面庫來開發(fā)這個應用,并展示如何實現(xiàn)基本的算術操作,希望對大家有所幫助
    2023-11-11
  • C語言中字符串庫函數(shù)的實現(xiàn)及模擬

    C語言中字符串庫函數(shù)的實現(xiàn)及模擬

    C語言中有很多數(shù)據類型,比如int(整數(shù)類型)、char(字符類型)、以及浮點型的double(雙精度)等。但是有一點就是我們發(fā)現(xiàn)這里并沒有提到我們常見的有關字符串的類型。本文為大家介紹了C語言中字符串庫函數(shù)的實現(xiàn)及模擬,需要的可以參考一下
    2022-11-11
  • VS2019上配置CUDA的環(huán)境步驟

    VS2019上配置CUDA的環(huán)境步驟

    本文主要介紹了VS2019上配置CUDA的環(huán)境步驟,文中通過圖文示例介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • C++ 設置控制臺(命令行)窗口 光標位置,及前背景顏色

    C++ 設置控制臺(命令行)窗口 光標位置,及前背景顏色

    這篇文章主要介紹了C++ 設置控制臺(命令行)窗口 光標位置,及前背景顏色,需要的朋友可以參考下
    2019-04-04

最新評論