国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

讓人壓抑的 C++:記一個函數(shù)指針的問題

開發(fā) 前端
如果你也需要直接獲取存儲的函數(shù)指針的地址,最好還是直接使用原始的函數(shù)指針,而不是通過 std::function 來存儲和獲取函數(shù)指針的地址。?

最近因?yàn)轫?xiàng)目要求用c++,之前一直很討厭c++,沒辦法只能短時間彌補(bǔ)c++的知識,項(xiàng)目中需要定義一個函數(shù)指針類型的vector,本以為很簡單的問題,結(jié)果調(diào)試了一天,才發(fā)現(xiàn)錯在哪里。

多余的std::function

先上代碼吧,這里有一個測試代碼,為什么要有測試代碼?是因?yàn)橄旅娴姆绞轿以谧铋_始驗(yàn)證該種實(shí)現(xiàn)時打印的地址是對的,但是之后一段時間就不對了,所以摘出來寫了一個測試代碼。

代碼非常簡單:使用using std::function的方式定義一個函數(shù)指針類型func_t,然后實(shí)現(xiàn)三個print函數(shù),在main函數(shù)中定義一個vector存放三個函數(shù)的地址,打印三個函數(shù)的實(shí)際地址,之后遍歷vector打印存放的元素值。


#include <iostream>
#include <vector>
#include <functional>

// 定義 std::function 類型的函數(shù)指針別名
using func_t = std::function<void(int, void*, size_t, size_t, void*)>;

// 示例函數(shù)
void print(int x, void* y, size_t a, size_t b, void* c) {
    std::cout << "print hello\n";
}

void print1(int x, void* y, size_t a, size_t b, void* c) {
    std::cout << "print1 hello\n";
}

void print2(int x, void* y, size_t a, size_t b, void* c) {
    std::cout << "print2 hello\n";
}

int main() {
    // 創(chuàng)建一個存儲 std::function 類型的函數(shù)指針對象的 std::vector
    std::vector<func_t> vec;

    // 使用 push_back 將函數(shù)指針對象添加到 std::vector 中
    vec.push_back(print);
    vec.push_back(print1);
    vec.push_back(print2);

    printf("%x, %x, %x\n", print, print1, print2);

    // 遍歷 std::vector 并依次調(diào)用存儲的函數(shù)指針對象
    for (const auto& func : vec) {
        // 調(diào)用函數(shù)指針對象
        //func(0, nullptr, 0, 0, nullptr);
        printf("%x.\n", func);
    }

    return 0;
}

執(zhí)行后的結(jié)果:

我最開始的理解是vector內(nèi)部存放的地址就是三個函數(shù)的地址。結(jié)果打印的結(jié)果意料之外啊,居然一樣,我嘗試在for循環(huán)遍歷時執(zhí)行該地址函數(shù),結(jié)果還能正常運(yùn)行。最開始以為是vector遍歷取值的問題,后來經(jīng)過一番驗(yàn)證沒問題,最后鎖定要函數(shù)指針定義上。

我嘗試切換一種函數(shù)指針定義,使用我最原始的方式:

// 定義 std::function 類型的函數(shù)指針別名
//using func_t = std::function<void(int, void*, size_t, size_t, void*)>;
using func_t = void (*)(int, void*, size_t, size_t, void*);

運(yùn)行后發(fā)現(xiàn)這次是對的了:

最后經(jīng)過一番查找,得出結(jié)論如下:

實(shí)際上,std::function 存儲函數(shù)指針時,不直接存儲函數(shù)指針本身的地址,而是存儲了函數(shù)指針對象的一些信息,因此直接使用 %x 來打印 std::function 存儲的函數(shù)指針可能無法獲得正確的地址。

在標(biāo)準(zhǔn)庫 中,std::function 是一個函數(shù)包裝器,它可以包含各種可調(diào)用對象(函數(shù)指針、函數(shù)對象、成員函數(shù)指針、Lambda 表達(dá)式等)。因此,std::function 內(nèi)部存儲了被包裝對象的地址以及其他信息,而不是直接將被包裝對象的地址暴露給用戶。

由于 std::function 對象的內(nèi)部結(jié)構(gòu)不同于原始函數(shù)指針, std::function 對象存儲了更多的信息,所以直接打印 std::function 對象的地址并不會得到和原始函數(shù)指針相同的值,打印它的地址并不等同于打印函數(shù)指針的地址。

所以,如果需要存儲函數(shù)指針并在之后通過 std::function 來調(diào)用它們,可以直接通過 std::function 來調(diào)用并且可以得到預(yù)期的結(jié)果,但是打印地址是不保證能夠得到和原始函數(shù)指針相同的地址(這也是我遇到了幾次和原始函數(shù)指針一致的時候,這也是造成我更迷茫的原因)。

那為什么打印的值一樣呢?

因?yàn)樵诒闅v std::vector<std::function> 時,即使它們指向不同的函數(shù),它們的內(nèi)部指針值可能是相同的,這是因?yàn)?std::function 可以包裝不同的可調(diào)用對象,但它們內(nèi)部可能使用相同的機(jī)制來存儲函數(shù)指針或者函數(shù)對象的地址。因此,打印 std::function 內(nèi)部存儲的函數(shù)指針值可能會得到相同的結(jié)果。但這不應(yīng)該影響 std::function 執(zhí)行其持有的不同函數(shù)的能力。

總結(jié)

如果你也需要直接獲取存儲的函數(shù)指針的地址(C語言的習(xí)慣),最好還是直接使用原始的函數(shù)指針,而不是通過 std::function 來存儲和獲取函數(shù)指針的地址。

責(zé)任編輯:趙寧寧 來源: 囧囧妹
相關(guān)推薦

2021-06-16 17:46:55

函數(shù)指針結(jié)構(gòu)

2011-04-11 14:18:37

CC++指針

2023-11-21 21:59:50

c++接口

2011-04-11 11:09:50

this指針

2023-11-22 13:22:51

C++函數(shù)

2024-07-03 12:04:42

C++this?

2021-05-28 18:12:51

C++設(shè)計(jì)

2021-06-18 12:30:36

C++函數(shù)指針編程語言

2011-07-20 17:54:02

C++

2014-01-24 09:49:01

C++指針

2011-07-14 17:02:09

C++指針

2018-01-29 21:56:28

Bug程序程序員

2024-05-15 16:01:04

C++編程開發(fā)

2021-01-13 06:58:35

C語言函數(shù)指針

2025-05-20 08:10:00

函數(shù)函數(shù)類型函數(shù)指針類型

2010-01-18 15:53:27

C++析構(gòu)函數(shù)

2011-04-19 16:38:00

對象指針指針C++

2011-04-19 09:19:09

C++指針

2011-07-15 01:38:56

C++this指針

2010-02-06 09:31:42

C++函數(shù)對象
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚州国产精品久久久| 在线免费观看a视频| 久久综合毛片| 99re精彩视频| 日韩电影毛片| 丝袜美腿亚洲一区| 亚洲国产精品99久久| 免费一级淫片| 亚洲欧洲av一区二区三区久久| 午夜亚洲激情| 精品视频一区 二区 三区| 校园春色欧美| 亚洲精品中文字幕在线观看| 亚洲免费一级视频| 99视频精品| 在线成人高清不卡| 正在播放久久| 国产一区不卡在线| 屁屁影院在线观看| 无码人妻少妇伦在线电影| 国产伦精一区二区三区| 尤物在线网址| 亚洲综合自拍一区| 91热门视频在线观看| 婷婷亚洲五月| 日韩中文在线字幕| 亚洲少妇久久久| 天天干天天操天天干天天操| 99久久婷婷这里只有精品| 日韩综合小视频| 精品一区二区三区自拍图片区| 91精品观看| 亚洲午夜久久久影院伊人 | 欧美一级精品大片| 性爱视频在线播放| 久久久精品国产| 祥仔av免费一区二区三区四区| 欧美噜噜久久久xxx| 啦啦啦中文在线观看日本| 国产人成亚洲第一网站在线播放| 欧美大陆一区二区| 粉嫩一区二区三区性色av| 激情av在线| 无码国模国产在线观看| 在线播放亚洲激情| 91欧美在线| 鲁一鲁一鲁一鲁一澡| 91国产免费看| 国色天香久久精品国产一区| 精品久久久久亚洲| 国产精品国产三级国产aⅴ中文 | 777午夜精品免费视频| 不卡一区视频| 精品伊人久久大线蕉色首页| 久久影音资源网| av免费看在线| 国产精品一区二区久久国产| 国产**成人网毛片九色 | 国产专区在线视频| 色视频一区二区| 日韩三级毛片| 欧美亚洲色图视频| 6080国产精品一区二区| 国产欧美日韩一区二区三区四区| 国产不卡一区二区视频| 日韩欧美另类在线| 午夜视频99| 日本不卡123| 粉嫩av一区二区三区四区五区| 原创国产精品91| 嫩草影院国产精品| 色婷婷精品大视频在线蜜桃视频| 福利视频一区| 51成人做爰www免费看网站| 国产婷婷精品av在线| 美女的胸无遮挡在线观看| 91中文字精品一区二区| 1000精品久久久久久久久| 天然素人一区二区视频| 欧美一区二区三区电影在线观看 | 51漫画成人app入口| 亚洲最大福利视频| 亚洲成人激情自拍| 偷拍亚洲精品| 69久久久久久| 久久九九有精品国产23| 国产传媒欧美日韩成人| 中文在线а√在线8| 亚洲精品国产精品久久| 一级二级在线观看| 日韩成人在线资源| 色综久久综合桃花网| 一区二区三区在线免费播放| 在线观看日韩av电影| 最新亚洲国产| 一广人看www在线观看免费视频| 成人在线免费高清视频| 91视频8mav| 欧美国产日韩二区| 亚洲精品国产精品国产自| 国产精品久久久久影院色老大| 欧美一级久久| 国产毛片一区二区三区| 综合久久2023| 深夜福利视频一区二区| av网址在线| 理论不卡电影大全神| 日本在线观看视频| 亚洲另类第一页| 国产成人超碰人人澡人人澡| 欧美精品第一区| jizz性欧美23| 免费观看性欧美大片无片| 91亚洲精品| 香蕉成人av| 欧美亚洲大片| 久久伊人精品| 另类一区二区| 九七影院97影院理论片久久| 免费的黄网站在线观看| 妺妺窝人体色www在线小说| 亚洲欧洲三级| 神马影院午夜我不卡| 日产精品久久久一区二区| 国产三级精品在线不卡| 99视频国产精品免费观看| 亚洲综合小说区| xxxxx成人.com| 韩剧1988在线观看免费完整版| www.66久久| 久久精品国产亚洲高清剧情介绍 | 国产黄色在线| 18av在线视频| 日本中文字幕在线一区| 亚洲四虎av| 久久久久久艹| 亚洲精品一二三四五区| 成人在线app| 精品一区二区三区中文字幕老牛| 黄色日韩精品| 不卡av在线网| 欧美午夜影院一区| 欧洲国产伦久久久久久久| 91国内精品野花午夜精品| 亚洲国产一区自拍| 中文字幕精品在线| 欧美性视频在线播放| 91吃瓜在线观看| 国产一级久久| 日韩欧美久久一区| 亚洲午夜精品久久| jizz欧美| 久久久蜜桃精品| 国产成人综合一区二区三区| 九色porn| 激情偷拍久久| 日韩一区二区三区电影| 国产精品一区二| 97电影在线观看| 久久在线视频免费观看| 日韩欧美在线观看视频| 成人18视频| 成年人黄视频在线观看| 免费在线观看成人av| 亚洲国产精品小视频| 成人毛片100部免费看| 欧美日韩精品一区二区三区视频| 日韩精品久久久久久久电影99爱| 日韩精品高清不卡| 日韩欧美亚洲一区二区| 国产精品水嫩水嫩| 国产精品∨欧美精品v日韩精品| 91精品中文在线| 免费国产在线观看| 蜜臀va亚洲va欧美va天堂 | 天天综合网91| 日韩精品一区二区三区在线观看| 日韩精品一区二区三区四区五区 | 黄色免费观看视频网站| 草草视频在线| 午夜精品福利久久久| 久久久久久久久久伊人| 欧美一区二区| 亚洲夜晚福利在线观看| 超碰影院在线| 久久综合成人精品亚洲另类欧美| 国产精品区一区| 免费不卡中文字幕在线| 中文字幕在线观看日韩| eeuss影院在线观看| 亚洲人一二三区| 精品少妇人妻av免费久久洗澡| 欧美午夜视频| 91精品久久久久久久| 天堂在线免费av| 久久久噜噜噜久久人人看| 欧美一区少妇| 久久久久久久久久久妇女| 久久成人av网站| 九九九伊在线综合永久|