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

C++ 內(nèi)聯(lián)函數(shù)inline Function示例詳解

 更新時間:2025年11月24日 09:35:03   作者:點(diǎn)云SLAM  
文章介紹了C++內(nèi)聯(lián)函數(shù)的含義、內(nèi)聯(lián)展開、編譯器何時內(nèi)聯(lián)以及內(nèi)聯(lián)對鏈接和性能的影響,內(nèi)聯(lián)函數(shù)允許在頭文件中定義函數(shù),以避免ODR錯誤,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

1. 內(nèi)聯(lián)函數(shù)的本質(zhì)

C++ 中的 inline 有兩個含義:

(1) 允許函數(shù)在多個翻譯單元中重復(fù)定義

用于放寬 ODR(One Definition Rule)。
→ 這是 inline 最重要的實(shí)際用途。

(2) 作為性能優(yōu)化提示

告訴編譯器“可以內(nèi)聯(lián)展開”。
→ 編譯器可以忽略,不是強(qiáng)制。

2. 內(nèi)聯(lián)展開是什么?

通常函數(shù)調(diào)用包含跳轉(zhuǎn)、壓棧、返回等開銷。
內(nèi)聯(lián)展開 = 把函數(shù)代碼直接拷貝到調(diào)用點(diǎn),避免調(diào)用開銷。

示例:

inline int sqr(int x) { return x * x; }

展開后等價于直接寫 x * x。

3. 編譯器何時會內(nèi)聯(lián)?

編譯器的優(yōu)化器根據(jù)啟發(fā)式?jīng)Q定:

會內(nèi)聯(lián)的典型情況:

  • 函數(shù)很短(幾行)
  • 在頭文件定義(可見函數(shù)體)
  • 優(yōu)化級別 O2 / O3
  • constexpr、模板、類內(nèi)定義成員(均“傾向內(nèi)聯(lián)”)

不會內(nèi)聯(lián)的情況:

  • 遞歸函數(shù)
  • 虛函數(shù)(除非去虛化)
  • 大型函數(shù)(幾十行以上)
  • 啟用 O0 無優(yōu)化
  • 編譯器認(rèn)為會導(dǎo)致代碼膨脹(ICache Miss 風(fēng)險)

4. inline 對鏈接的影響

普通函數(shù)只能在一個 .cpp 中定義,否則多重定義錯誤。

但 inline 函數(shù)可以這樣:

// foo.h
inline int add(int a, int b) { return a + b; }

然后出現(xiàn)在多個 cpp 中,鏈接器會合并。

類內(nèi)定義的函數(shù)默認(rèn) inline,因此類成員函數(shù)出現(xiàn)在頭文件是合法的。

模板函數(shù)也是同理(模板必須寫在頭文件)。

5. inline vs 宏

對比項(xiàng)inline
類型檢查
作用域文本替換
調(diào)試支持
常見用途小函數(shù)簡單表達(dá)式、條件編譯

一般規(guī)則:能用 inline,就不要用宏。

6. inline 對性能的真實(shí)影響

正面:

  • 消除函數(shù)調(diào)用成本(主要在小函數(shù)中有效)
  • 觸發(fā)更多優(yōu)化(常量傳播、死代碼刪除)

負(fù)面:

  • 代碼膨脹,可能讓指令緩存命中率下降 → 性能變差
  • 大函數(shù)內(nèi)聯(lián)通常是負(fù)優(yōu)化

因此:

內(nèi)聯(lián)最有效的場景:頻繁調(diào)用的小函數(shù)(數(shù)學(xué)計(jì)算、向量操作)。

(Eigen、Sophus、GTSAM 都這么做)

7. 工程中內(nèi)聯(lián)的推薦模式

應(yīng)當(dāng)內(nèi)聯(lián):

  • 小函數(shù)(特別是數(shù)學(xué)運(yùn)算)
  • getter/setter
  • 模板函數(shù)
  • 類內(nèi)定義成員函數(shù)
  • 簡單內(nèi)存操作和判斷邏輯

不要內(nèi)聯(lián):

  • 復(fù)雜流程函數(shù)(ICP、優(yōu)化殘差、求導(dǎo))
  • 大循環(huán)
  • 虛函數(shù)
  • 調(diào)試時需要斷點(diǎn)的復(fù)雜函數(shù)

8. 常見誤區(qū)

誤區(qū) 1:加 inline 就會內(nèi)聯(lián)

事實(shí):編譯器完全可以忽略。

誤區(qū) 2:內(nèi)聯(lián)一定加速

事實(shí):大函數(shù)內(nèi)聯(lián)反而變慢。

誤區(qū) 3:inline 主要用來優(yōu)化性能

事實(shí):inline 的核心用途是允許頭文件重復(fù)定義函數(shù)。

9. 精簡總結(jié)

  • inline = “允許多次定義” + “可選擇性內(nèi)聯(lián)展開”
  • 編譯器才最終決定是否真正內(nèi)聯(lián)
  • 用于頭文件小函數(shù)非常合適
  • 濫用會導(dǎo)致代碼膨脹和性能下降
  • 函數(shù)越短越可能被內(nèi)聯(lián)

10.C++ 內(nèi)聯(lián)函數(shù)綜合示例

1.最常用:類內(nèi)定義 = 默認(rèn)內(nèi)聯(lián)

class Vec3 {
public:
    double x, y, z;
    // 類內(nèi)定義 → 默認(rèn) inline
    double norm2() const { 
        return x * x + y * y + z * z; 
    }
    void scale(double s) {
        x *= s; y *= s; z *= s;
    }
};

特點(diǎn):

  • 類內(nèi)定義的函數(shù)自動成為 inline
  • 在頭文件中使用時不會導(dǎo)致 ODR 沖突
  • 常用于 getters/setters、小數(shù)學(xué)操作(SLAM 中大量使用)

2.類外定義 but 內(nèi)聯(lián):適用于頭文件工具函數(shù)

// vec_utils.h
#pragma once
inline double dot(const Vec3& a, const Vec3& b) {
    return a.x*b.x + a.y*b.y + a.z*b.z;
}

為什么要 inline?

因?yàn)轭^文件中定義函數(shù),如果不 inline → 多重定義。

適合:數(shù)學(xué)工具函數(shù)、小型轉(zhuǎn)換函數(shù)、小 lambda 替代。

3.模板函數(shù)天然 inline

SLAM & 點(diǎn)云處理中大量用的模板代碼本質(zhì)都是 inline:

template<typename T>
inline T clamp(T v, T lo, T hi) {
    return (v < lo) ? lo : (v > hi) ? hi : v;
}

其實(shí)模板函數(shù)不寫 inline 也能 inline,因?yàn)椋?/p>

  • 模板必須放頭文件
  • 每個 TU 都需要實(shí)例化
  • 編譯器會自動當(dāng)成 inline 處理

4.內(nèi)聯(lián) + constexpr(超輕量函數(shù)最佳組合)

constexpr inline double deg2rad(double deg) {
    return deg * 3.14159265358979323846 / 180.0;
}

用途:

  • 編譯期數(shù)學(xué)常量
  • 小型轉(zhuǎn)換函數(shù)
  • 角度/弧度轉(zhuǎn)換(SLAM 必備)

5.內(nèi)聯(lián) setter / getter

強(qiáng)烈推薦用于性能敏感代碼(尤其是數(shù)學(xué)類型/幾何類):

class Pose {
public:
    inline double x() const { return tx; }
    inline void setX(double v) { tx = v; }
private:
    double tx;
};

現(xiàn)代 C++ get/set 可 inline 解決跳轉(zhuǎn)開銷。

6.內(nèi)聯(lián) + forceinline 強(qiáng)制內(nèi)聯(lián)(GCC/Clang/MSVC)

對于高度性能敏感的代碼(例如點(diǎn)云 ICP 內(nèi)循環(huán)):

#if defined(_MSC_VER)
#define FORCE_INLINE __forceinline
#else
#define FORCE_INLINE __attribute__((always_inline)) inline
#endif
FORCE_INLINE double sqr(double x) { return x * x; }

注意:

  • 濫用會導(dǎo)致代碼膨脹(影響指令緩存)
  • 建議用于極短(1~3 行)的小函數(shù)

7.與 static inline 結(jié)合用于 header-only 工具庫

可避免 ODR 沖突:

// math_utils.h
#pragma once
static inline double fast_min(double a, double b) {
    return (a < b) ? a : b;
}

推薦場景:
頭文件單獨(dú)工具函數(shù),但不希望暴露全局符號。

8.類模板內(nèi)聯(lián)成員函數(shù)(Eigen, Sophus, SLAM 常用寫法)

template<typename T>
class Box {
private:
    T min_, max_;
public:
    inline T size() const { return max_ - min_; }
    inline bool contains(const T& x) const { return x >= min_ && x <= max_; }
};

典型用途:Bounding box、SE(3)、SO(3) 數(shù)學(xué)類型等。

9.內(nèi)聯(lián)函數(shù)的真實(shí)性能對比(示例)

非內(nèi)聯(lián)版本(有函數(shù)調(diào)用開銷)

double sqr(double x) { return x*x; }
double sum(const std::vector<double>& v) {
    double s = 0;
    for(double x : v) s += sqr(x);
    return s;
}

編譯器可能無法展開(尤其跨文件編譯時)。

內(nèi)聯(lián)版本(更易優(yōu)化)

inline double sqr(double x) { return x*x; }

優(yōu)勢:

  • 去掉調(diào)用開銷
  • 可進(jìn)行循環(huán)展開 / SIMD 優(yōu)化
  • 能被進(jìn)一步優(yōu)化為 x*x 的常量傳播

10.完整示例:內(nèi)聯(lián) + 模板 + 內(nèi)聯(lián)類成員

這是一個仿 SLAM 庫的小型數(shù)學(xué)類型示例:

#pragma once
#include <cmath>
class Vec3 {
public:
    double x, y, z;
    inline Vec3(double X, double Y, double Z)
        : x(X), y(Y), z(Z) {}
    inline double dot(const Vec3& o) const {
        return x*o.x + y*o.y + z*o.z;
    }
    inline Vec3 operator+(const Vec3& o) const {
        return Vec3(x+o.x, y+o.y, z+o.z);
    }
    inline Vec3 normalized() const {
        double n = std::sqrt(dot(*this));
        return Vec3(x/n, y/n, z/n);
    }
};
// 工具函數(shù)(header-only)
inline double distance(const Vec3& a, const Vec3& b) {
    return (a + Vec3(-b.x, -b.y, -b.z)).normalized().dot(a);
}

這是 SLAM / ICP / 點(diǎn)云算法中常見的數(shù)學(xué)類寫法:
全都 inline,以消除函數(shù)開銷,加速內(nèi)循環(huán)。

小結(jié):內(nèi)聯(lián)函數(shù)的最佳工程實(shí)踐

場景是否 inline
類內(nèi)部定義自動 inline,推薦
頭文件小工具函數(shù)必須 inline
模板函數(shù)自動 inline, OK
性能敏感數(shù)學(xué)函數(shù)inline 或 forceinline
大型函數(shù)不推薦(代碼膨脹)
接口函數(shù)(虛函數(shù))不能 inline

到此這篇關(guān)于C++ 內(nèi)聯(lián)函數(shù)(inline Function)詳解的文章就介紹到這了,更多相關(guān)C++ 內(nèi)聯(lián)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在vs2017上配置AppGameKit庫的圖文教程

    在vs2017上配置AppGameKit庫的圖文教程

    這篇文章主要介紹了在vs2017上配置AppGameKit庫的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • C語言基礎(chǔ)野指針與空指針示例分析

    C語言基礎(chǔ)野指針與空指針示例分析

    全網(wǎng)最接地氣的C語言野指針介紹,此處對于野指針與空指針知識點(diǎn)做一些簡要的介紹,作者實(shí)屬初學(xué),難免文章中有內(nèi)容理解不到位或者有不當(dāng)之處,還請朋友們不吝指正,希望大家多多給予支持
    2021-11-11
  • 詳解CLion配置openMP的方法

    詳解CLion配置openMP的方法

    這篇文章主要介紹了CLion配置openMP的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Qt實(shí)現(xiàn)Slider滑塊條組件的示例代碼

    Qt實(shí)現(xiàn)Slider滑塊條組件的示例代碼

    在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,本文主要介紹了Qt實(shí)現(xiàn)Slider滑塊條組件的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • 帶你了解C++中vector的用法

    帶你了解C++中vector的用法

    大家好,本篇文章主要講的是帶你了解C++中vector的用法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++?AVL樹的兩單旋和兩雙旋的項(xiàng)目實(shí)踐

    C++?AVL樹的兩單旋和兩雙旋的項(xiàng)目實(shí)踐

    本文主要介紹了C++?AVL樹的兩單旋和兩雙旋的項(xiàng)目實(shí)踐,根據(jù)節(jié)點(diǎn)插入位置的不同,AVL樹的旋轉(zhuǎn)分為四種,下面就來介紹一下,感興趣的可以了解一下
    2024-03-03
  • C++簡明分析講解引用與函數(shù)提高及重載

    C++簡明分析講解引用與函數(shù)提高及重載

    今天繼續(xù)開始對C++核心編程知識的分享與系統(tǒng)講解,第一,這里會提到“引用”方法傳參以及剖析引用的本質(zhì);第二,我們對函數(shù)來一個提高,相當(dāng)于進(jìn)階函數(shù)了,包括函數(shù)的默認(rèn)值,簡單的提一下函數(shù)的占位參數(shù),函數(shù)重載以及注意事項(xiàng),接下來上正文
    2022-05-05
  • C++實(shí)現(xiàn)LeetCode(15.三數(shù)之和)

    C++實(shí)現(xiàn)LeetCode(15.三數(shù)之和)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(三數(shù)之和),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言數(shù)據(jù)輸入與輸出實(shí)例詳解

    C語言數(shù)據(jù)輸入與輸出實(shí)例詳解

    這篇文章主要介紹了C語言數(shù)據(jù)輸入與輸出實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++編寫的WebSocket服務(wù)端客戶端實(shí)現(xiàn)示例代碼

    C++編寫的WebSocket服務(wù)端客戶端實(shí)現(xiàn)示例代碼

    本文主要介紹了C++編寫的WebSocket服務(wù)端客戶端實(shí)現(xiàn)示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評論

方正县| 东乌珠穆沁旗| 井冈山市| 大同县| 闽清县| 兴化市| 和林格尔县| 河池市| 嘉祥县| 武平县| 邹城市| 东阿县| 探索| 克山县| 大名县| 毕节市| 金乡县| 邯郸县| 乐至县| 湖州市| 满城县| 临湘市| 社会| 武汉市| 黄大仙区| 沅陵县| 香河县| 湘乡市| 图木舒克市| 汶上县| 福贡县| 灵丘县| 遂昌县| 秭归县| 洪雅县| 台中市| 乌兰察布市| 公安县| 武宣县| 会东县| 吴旗县|