最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++接口內(nèi)部?jī)?nèi)存分配問題設(shè)計(jì)方案

 更新時(shí)間:2026年04月13日 09:06:45   作者:CVer兒  
本文主要介紹了在C++中使用二級(jí)指針(**)進(jìn)行內(nèi)存分配和數(shù)據(jù)傳遞的主要應(yīng)用場(chǎng)景,結(jié)合使用vector和二級(jí)指針進(jìn)行數(shù)據(jù)傳遞的方法,感興趣的朋友跟隨小編一起看看吧

1. 為什么要傳入“二級(jí)指針” (**)?

當(dāng)你需要 C++ 內(nèi)部產(chǎn)生一份未知大小的數(shù)據(jù),并把數(shù)據(jù)交還給外部時(shí):

  • 如果你傳一級(jí)指針 (DataPoints* ptr):C++ 內(nèi)部執(zhí)行 ptr = new DataPoints[10]; 時(shí),修改的只是 ptr 這個(gè)變量在棧上的局部副本。函數(shù)一結(jié)束,外部的指針依然是 nullptr,不僅拿不到數(shù)據(jù),還會(huì)造成內(nèi)存泄漏。
  • 傳入二級(jí)指針 (DataPoints** ptr_addr):你傳進(jìn)來的是“外部指針變量的地址”。C++ 內(nèi)部執(zhí)行 *ptr_addr = new DataPoints[10]; 時(shí),是直接順著地址找到了外部的那個(gè)指針,把新分配的內(nèi)存首地址硬塞給它。這樣外部就能成功拿到數(shù)據(jù)了。

2. 必須“C++ 內(nèi)部分配,并提供內(nèi)部接口釋放”

傳入一級(jí)指針通常用于以下 三大黃金場(chǎng)景

場(chǎng)景一:只讀的數(shù)據(jù)輸入(Input Arrays / Structs)

當(dāng)需要把大量數(shù)據(jù)從 C# 傳給 C++ 讓它進(jìn)行計(jì)算時(shí),絕不會(huì)把幾十萬個(gè)坐標(biāo)點(diǎn)按值(By Value)傳進(jìn)去,而是傳首地址(一級(jí)指針)。

  • 工作流:C# 在自己的托管堆(或非托管堆)上準(zhǔn)備好了一排 DataPoints,然后把**首個(gè)元素的地址(一級(jí)指針)**傳給 C++。C++ 內(nèi)部只做遍歷和讀?。?code>Bins[i].DataPoints_x),絕對(duì)不會(huì)對(duì) Bins 執(zhí)行 newdelete。
  • 總結(jié):用于**“只讀”**的大塊數(shù)據(jù)傳輸。

場(chǎng)景二:調(diào)用方預(yù)分配內(nèi)存的高速填充

        這是工業(yè)視覺和音視頻處理中最高效、最極客的輸出模式。 如果 C# 端提前知道計(jì)算結(jié)果大概有多大(或者結(jié)果大小是固定的),那么由 C# 提前申請(qǐng)好內(nèi)存,傳一級(jí)指針給 C++ 去“填空”,是比“二級(jí)指針內(nèi)部 new”更快的做法!

舉個(gè)實(shí)際的例子: 假設(shè)你的點(diǎn)云重采樣后固定是 1200 個(gè)點(diǎn),C# 完全可以自己提前 new double[1200]。

C++ 接口設(shè)計(jì):

// 傳入一級(jí)指針 pre_alloc_x 和 pre_alloc_y
void ProcessSingleCloud(double* pre_alloc_x, double* pre_alloc_y, int fixed_len) {
    // C++ 內(nèi)部絕對(duì)不寫 new!直接往外部傳進(jìn)來的地址里塞數(shù)據(jù)
    for(int i=0; i<fixed_len; i++) {
        pre_alloc_x[i] = ...; // 直接填充
        pre_alloc_y[i] = ...;
    }
}

C# 調(diào)用方:

// C# 自己分配好內(nèi)存
double[] out_x = new double[1200];
double[] out_y = new double[1200];
// 傳首地址(一級(jí)指針)給 C++
ProcessSingleCloud(out_x, out_y, 1200); 
// 調(diào)用結(jié)束,數(shù)據(jù)已經(jīng)在 out_x 里了,完全不需要管釋放問題(C# 的 GC 會(huì)自動(dòng)回收)!

優(yōu)勢(shì):徹底干掉了 FreeDataPoints 這步操作!沒有任何跨語言釋放內(nèi)存的風(fēng)險(xiǎn),性能達(dá)到絕對(duì)的物理極限。

劣勢(shì):如果 C++ 計(jì)算出來的結(jié)果大小是未知的(比如不確定會(huì)返回 500 個(gè)點(diǎn)還是 800 個(gè)點(diǎn)),C# 就無法提前精準(zhǔn)分配內(nèi)存,這時(shí)候就只能退回“二級(jí)指針內(nèi)部 new”的方案了。

3 vector結(jié)合二級(jí)指針

        既然 vector 這么好用(比如不確定最終會(huì)匹配出多少個(gè)結(jié)果時(shí),可以隨時(shí) push_back),我們當(dāng)然要在內(nèi)部用它。

正確的架構(gòu)模式是:數(shù)據(jù)在函數(shù)內(nèi)部完全用 std::vector 裝載,但在函數(shù)的最后一行,把 vector 里的數(shù)據(jù)“過繼(Copy/Move)”給一個(gè)通過 new[] 分配的裸數(shù)組。

完美結(jié)合 Vector 的代碼實(shí)現(xiàn):

void F_FindSimilarXldPoint(..., DataPoints** DataPoints_tf, int* DataPoints_tfCount) {
    // 1. 內(nèi)部愉快地使用 vector,享受動(dòng)態(tài)擴(kuò)容的便利
    std::vector<DataPoints> temp_results;
    for (int i = 0; i < batch; ++i) {
        // 假設(shè)某些條件不滿足,直接 continue,最終數(shù)量不確定
        if (/* 匹配失敗 */ false) continue; 
        // 構(gòu)造單個(gè)結(jié)果
        DataPoints dp;
        dp.DataPoints_Lenth = 1200;
        // ?? 注意:底層坐標(biāo)數(shù)組必須也是 new 出來的,因?yàn)橐獋鹘o外部
        dp.DataPoints_x = new double[1200];
        dp.DataPoints_y = new double[1200];
        // ... 填充坐標(biāo)數(shù)據(jù) ...
        temp_results.push_back(dp); // 裝入 vector
    }
    // ==========================================================
    // 2. ?? 核心交接儀式 (Transfer Ownership)
    // ==========================================================
    int final_count = temp_results.size();
    *DataPoints_tfCount = final_count;
    if (final_count > 0) {
        // 分配一塊干凈的裸數(shù)組內(nèi)存
        DataPoints* out_array = new DataPoints[final_count];
        // 淺拷貝:把 vector 里的 DataPoints 結(jié)構(gòu)體(包含里面的 x, y 指針)
        // 逐個(gè)復(fù)制給 out_array
        for (int i = 0; i < final_count; ++i) {
            out_array[i] = temp_results[i]; 
        }
        // 把裸數(shù)組的地址交給二級(jí)指針
        *DataPoints_tf = out_array;
    } else {
        *DataPoints_tf = nullptr;
    }
} // <--- 函數(shù)結(jié)束,temp_results(vector) 被銷毀。
  // 但是不用擔(dān)心!因?yàn)?vector 里裝的是指針副本,
  // 真正的數(shù)據(jù) (new double[] 和 new DataPoints[]) 已經(jīng)掛在 out_array 上活下來了!

極小開銷: 你可能會(huì)擔(dān)心最后的 for 循環(huán)復(fù)制會(huì)慢。其實(shí)完全不會(huì)!這里發(fā)生的是淺拷貝 (Shallow Copy),僅僅是復(fù)制了 DataPoints 結(jié)構(gòu)體里的 3 個(gè)變量(兩個(gè)指針,一個(gè) int),并沒有復(fù)制那 1200 個(gè) double 數(shù)據(jù)。就算有 1000 個(gè)零件,復(fù)制 1000 個(gè)結(jié)構(gòu)體的時(shí)間連 0.01 毫秒都不到。

到此這篇關(guān)于C++接口內(nèi)部?jī)?nèi)存分配問題設(shè)計(jì)方案的文章就介紹到這了,更多相關(guān)c++接口內(nèi)部?jī)?nèi)存分配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++棧溢出實(shí)戰(zhàn)案例解析

    C++棧溢出實(shí)戰(zhàn)案例解析

    棧溢出是C++中常見的“隱形殺手”,由于棧內(nèi)存有限,可能會(huì)導(dǎo)致程序崩潰,理解棧的工作原理和有限性,以及掌握相應(yīng)的解決方案,是避免棧溢出的關(guān)鍵,本文給大家介紹C++棧溢出實(shí)戰(zhàn)案例解析,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • Qt6.0+vs2019環(huán)境配置的實(shí)現(xiàn)教程

    Qt6.0+vs2019環(huán)境配置的實(shí)現(xiàn)教程

    這篇文章主要介紹了Qt6.0+vs2019環(huán)境配置的實(shí)現(xiàn)教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Qt HTTP Client的實(shí)現(xiàn)示例

    Qt HTTP Client的實(shí)現(xiàn)示例

    Qt的HTTP客戶端API提供了強(qiáng)大的網(wǎng)絡(luò)通信功能,包括GET和POST請(qǐng)求,支持跨平臺(tái)開發(fā),通過QNetworkAccessManager、QNetworkRequest和QNetworkReply三個(gè)核心類,開發(fā)者可以輕松實(shí)現(xiàn)HTTP通信,
    2026-02-02
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法時(shí)間空間復(fù)雜度基礎(chǔ)實(shí)踐

    C語言數(shù)據(jù)結(jié)構(gòu)與算法時(shí)間空間復(fù)雜度基礎(chǔ)實(shí)踐

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)與算法中時(shí)間空間復(fù)雜度的基礎(chǔ)實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • C++ Hjson-cpp處理JSON類型配置文件詳解

    C++ Hjson-cpp處理JSON類型配置文件詳解

    Hjson-Cpp是C++實(shí)現(xiàn)的Hjson解析庫,支持注釋、多行字符串等更友好的語法,適用于配置文件等場(chǎng)景,下面我們就來看看它的具體使用方法吧
    2025-06-06
  • C語言實(shí)現(xiàn)可增容動(dòng)態(tài)通訊錄詳細(xì)過程

    C語言實(shí)現(xiàn)可增容動(dòng)態(tài)通訊錄詳細(xì)過程

    這篇文章主要為大家介紹了C語言實(shí)現(xiàn)簡(jiǎn)易通訊錄的完整流程,此通訊錄還可以增容,并且每個(gè)環(huán)節(jié)都有完整代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-05-05
  • C++中純虛函數(shù)的實(shí)例詳解

    C++中純虛函數(shù)的實(shí)例詳解

    純虛函數(shù)就是一個(gè)在基類中的虛函數(shù),差別只是在一般的虛函數(shù)聲明的后面加了“=0”,下面這篇文章主要給大家介紹了關(guān)于C++中純虛函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • C語言實(shí)現(xiàn)井字棋(三子棋)

    C語言實(shí)現(xiàn)井字棋(三子棋)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 利用C語言實(shí)現(xiàn)2048小游戲的方法

    利用C語言實(shí)現(xiàn)2048小游戲的方法

    2048是比較流行的一款數(shù)字游戲,相信對(duì)大家來說都不陌生,這篇文章給大家分享了利用C語言實(shí)現(xiàn)2048小游戲的方法,對(duì)大家學(xué)習(xí)理解C語言具有一定的參考借鑒價(jià)值,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • c++實(shí)現(xiàn)對(duì)輸入數(shù)組進(jìn)行快速排序的示例(推薦)

    c++實(shí)現(xiàn)對(duì)輸入數(shù)組進(jìn)行快速排序的示例(推薦)

    下面小編就為大家?guī)硪黄猚++實(shí)現(xiàn)對(duì)輸入數(shù)組進(jìn)行快速排序的示例(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06

最新評(píng)論

乌恰县| 封开县| 集贤县| 陵川县| 威信县| 突泉县| 南澳县| 遂平县| 濮阳市| 永修县| 松溪县| 隆尧县| 班玛县| 容城县| 印江| 北碚区| 平昌县| 息烽县| 平昌县| 明溪县| 新绛县| 大英县| 嘉兴市| 八宿县| 新巴尔虎左旗| 湘阴县| 集贤县| 嘉祥县| 遂溪县| 探索| 江安县| 温宿县| 沙河市| 婺源县| 云南省| 溧水县| 涡阳县| 绥宁县| 雅安市| 拉萨市| 嘉义县|