AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-11-28 17:12:00 267觀看
導讀最近因為項目要求用c++,之前一直很討厭c++,沒辦法只能短時間彌補c++的知識,項目中需要定義一個函數指針類型的vector,本以為很簡單的問題,結果調試了一天,才發現錯在哪里。多余的std::function先上代碼吧,這里有一個測試代碼

最近因為項目要求用c++,之前一直很討厭c++,沒辦法只能短時間彌補c++的知識,項目中需要定義一個函數指針類型的vector,本以為很簡單的問題,結果調試了一天,才發現錯在哪里。BxN28資訊網——每日最新資訊28at.com

BxN28資訊網——每日最新資訊28at.com

多余的std::function

先上代碼吧,這里有一個測試代碼,為什么要有測試代碼?是因為下面的方式我在最開始驗證該種實現時打印的地址是對的,但是之后一段時間就不對了,所以摘出來寫了一個測試代碼。BxN28資訊網——每日最新資訊28at.com

代碼非常簡單:使用using std::function的方式定義一個函數指針類型func_t,然后實現三個print函數,在main函數中定義一個vector存放三個函數的地址,打印三個函數的實際地址,之后遍歷vector打印存放的元素值。BxN28資訊網——每日最新資訊28at.com

#include <iostream>#include <vector>#include <functional>// 定義 std::function 類型的函數指針別名using func_t = std::function<void(int, void*, size_t, size_t, void*)>;// 示例函數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() {    // 創建一個存儲 std::function 類型的函數指針對象的 std::vector    std::vector<func_t> vec;    // 使用 push_back 將函數指針對象添加到 std::vector 中    vec.push_back(print);    vec.push_back(print1);    vec.push_back(print2);    printf("%x, %x, %x/n", print, print1, print2);    // 遍歷 std::vector 并依次調用存儲的函數指針對象    for (const auto& func : vec) {        // 調用函數指針對象        //func(0, nullptr, 0, 0, nullptr);        printf("%x./n", func);    }    return 0;}

執行后的結果:BxN28資訊網——每日最新資訊28at.com

BxN28資訊網——每日最新資訊28at.com

我最開始的理解是vector內部存放的地址就是三個函數的地址。結果打印的結果意料之外啊,居然一樣,我嘗試在for循環遍歷時執行該地址函數,結果還能正常運行。最開始以為是vector遍歷取值的問題,后來經過一番驗證沒問題,最后鎖定要函數指針定義上。BxN28資訊網——每日最新資訊28at.com

我嘗試切換一種函數指針定義,使用我最原始的方式:BxN28資訊網——每日最新資訊28at.com

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

BxN28資訊網——每日最新資訊28at.com

運行后發現這次是對的了:BxN28資訊網——每日最新資訊28at.com

BxN28資訊網——每日最新資訊28at.com

BxN28資訊網——每日最新資訊28at.com

最后經過一番查找,得出結論如下:BxN28資訊網——每日最新資訊28at.com

實際上,std::function 存儲函數指針時,不直接存儲函數指針本身的地址,而是存儲了函數指針對象的一些信息,因此直接使用 %x 來打印 std::function 存儲的函數指針可能無法獲得正確的地址。BxN28資訊網——每日最新資訊28at.com

在標準庫 中,std::function 是一個函數包裝器,它可以包含各種可調用對象(函數指針、函數對象、成員函數指針、Lambda 表達式等)。因此,std::function 內部存儲了被包裝對象的地址以及其他信息,而不是直接將被包裝對象的地址暴露給用戶。BxN28資訊網——每日最新資訊28at.com

由于 std::function 對象的內部結構不同于原始函數指針, std::function 對象存儲了更多的信息,所以直接打印 std::function 對象的地址并不會得到和原始函數指針相同的值,打印它的地址并不等同于打印函數指針的地址。BxN28資訊網——每日最新資訊28at.com

所以,如果需要存儲函數指針并在之后通過 std::function 來調用它們,可以直接通過 std::function 來調用并且可以得到預期的結果,但是打印地址是不保證能夠得到和原始函數指針相同的地址(這也是我遇到了幾次和原始函數指針一致的時候,這也是造成我更迷茫的原因)。BxN28資訊網——每日最新資訊28at.com

BxN28資訊網——每日最新資訊28at.com

那為什么打印的值一樣呢?BxN28資訊網——每日最新資訊28at.com

因為在遍歷 std::vector<std::function> 時,即使它們指向不同的函數,它們的內部指針值可能是相同的,這是因為 std::function 可以包裝不同的可調用對象,但它們內部可能使用相同的機制來存儲函數指針或者函數對象的地址。因此,打印 std::function 內部存儲的函數指針值可能會得到相同的結果。但這不應該影響 std::function 執行其持有的不同函數的能力。BxN28資訊網——每日最新資訊28at.com

總結

BxN28資訊網——每日最新資訊28at.com

如果你也需要直接獲取存儲的函數指針的地址(C語言的習慣),最好還是直接使用原始的函數指針,而不是通過 std::function 來存儲和獲取函數指針的地址。BxN28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-34923-0.html讓人壓抑的 C++:記一個函數指針的問題

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 大型直播活動保障S13的實踐和思考

下一篇: Istio新架構揭秘:環境化Mesh

標簽:
  • 熱門焦點
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛如火如荼的宣傳了K60 Ultra的各種技術和硬件配置,作為競品的一加也坐不住了。一加中國區總裁李杰發布了兩條微博,表示在自家的一加Ace2上早就已經采用了和PixelWo
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 企業采用CRM系統的11個好處

    客戶關系管理(CRM)軟件可以為企業提供很多的好處,從客戶保留到提高生產力。  CRM軟件用于企業收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規模如今超過580
  • 分享六款相見恨晚的PPT模版網站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網站旨在為全球Office用戶提供豐富的高品質原創PPT模板、實用文檔、數據圖表及個性化定制服務。優點:OfficePLUS是微軟官方網站,囊括PPT模板、Word模
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 中國家電海外掘金正當時|出海專題

    作者|吳南南編輯|胡展嘉運營|陳佳慧出品|零態LT(ID:LingTai_LT)2023年,出海市場戰況空前,中國創業者在海外紛紛摩拳擦掌,以期能夠把中國的商業模式、創業理念、戰略打法輸出海外,他們依
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • iQOO 11S屏幕細節公布:首發三星2K E6全感屏 安卓最好的直屏手機

    日前iQOO手機官方宣布,新一代電競旗艦iQOO 11S將會在7月4日19:00正式與大家見面。隨著發布時間的日益臨近,官方關于該機的預熱也更加密集,截至目前已
Top