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

C++20 Modules模塊的使用小結(jié)

 更新時(shí)間:2026年06月30日 08:58:40   作者:碼云數(shù)智-園園  
本文主要介紹了C++20 Modules模塊的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

C++ 開發(fā)者等這一天,等了三十年。

C++20 正式引入 Modules(模塊),這不是給頭文件換個(gè)皮,而是徹底重構(gòu)了 C++ 的編譯模型。傳統(tǒng) #include 的文本復(fù)制機(jī)制終于要被送進(jìn)歷史博物館了。

一、頭文件機(jī)制的四宗罪

傳統(tǒng) C++ 靠 .h + .cpp 組織代碼,看似清晰,實(shí)則暗瘡密布:

痛點(diǎn)表現(xiàn)
編譯慢每次 #include 都重新解析整份頭文件,百萬行項(xiàng)目編譯時(shí)間呈 O(n²) 增長
宏污染#define MAX 100 可能讓你的 min() 函數(shù)靜默崩潰,排查如同大海撈針
循環(huán)包含A.h 包含 B.h,B.h 又包含 A.h —— 無限套娃,#pragma once 只是創(chuàng)可貼
命名沖突不同頭文件定義同名函數(shù)/宏,命名空間也救不了全局污染

預(yù)編譯頭文件(PCH)能緩解,但不夠靈活、不可移植、維護(hù)成本高。Modules 才是真正的解藥。

二、Modules 的核心機(jī)制:二進(jìn)制接口緩存(BMI)

Modules 的本質(zhì)是:聲明不再靠復(fù)制粘貼進(jìn)每個(gè)翻譯單元,而是由編譯器統(tǒng)一導(dǎo)出、導(dǎo)入二進(jìn)制接口(BMI)。

傳統(tǒng)方式:#include → 文本復(fù)制 → 預(yù)處理器展開 → 每次重新編譯
Modules 方式:import → 加載已編譯的 BMI → 直接復(fù)用,零重復(fù)解析

這意味著:

  • import 不展開宏不污染全局命名空間、不重復(fù)解析模板聲明
  • 模塊只編譯一次,后續(xù)所有導(dǎo)入直接引用緩存結(jié)果
  • 編譯時(shí)間從 O(n²) 優(yōu)化到接近 O(n),實(shí)測(cè)大型項(xiàng)目編譯提速 40%~50% 以上

三、語法:export + import,就這么簡單

3.1 定義模塊接口(.ixx 或 .cppm)

// math.ixx
export module math;
export int add(int a, int b) {
    return a + b;
}
export int multiply(int a, int b) {
    return a * b;
}
// 未導(dǎo)出的內(nèi)容,外部完全不可見
static int helper(int x) { return x * 2; }  // 模塊內(nèi)私有

?? export module math; 必須是文件第一行非空非注釋行,前面哪怕一個(gè)空行,Clang 就報(bào)錯(cuò)。

3.2 分離實(shí)現(xiàn)(可選)

// math_impl.cpp
module math;
int add(int a, int b) {
    return a + b;
}

3.3 使用模塊

// main.cpp
import math;
#include <iostream>
int main() {
    std::cout << add(3, 4) << std::endl;       // ? 可用
    std::cout << multiply(3, 4) << std::endl;  // ? 可用
    // helper();  // ? 編譯錯(cuò)誤:不可見
}

不需要 #include "math.h",不需要任何頭文件。

四、模塊分區(qū):大型項(xiàng)目的殺手級(jí)特性

C++20 支持將模塊拆分為子單元(Module Partitions),便于管理:

// math_core.ixx
export module math:core;
export int add(int a, int b) { return a + b; }
// math_extra.ixx
export module math:extra;
export import :core;  // 導(dǎo)入子分區(qū)
export int square(int x) { return x * x; }
// math.ixx(主模塊)
export module math;
export import :core;
export import :extra;

主模塊 math 統(tǒng)一 re-export 所有分區(qū),使用者只需 import math; 即可。

五、編譯命令:各編譯器差異

編譯器版本要求編譯命令
MSVCVS 2019 16.8+cl /std:c++20 /experimental:module math.ixx main.cpp
Clang13+clang++ -std=c++20 -fmodules math.ixx main.cpp
GCC11+(實(shí)驗(yàn)性)g++ -std=c++20 -fmodules-ts math.ixx main.cpp

Clang 需兩步:先 clang++ -std=c++20 -fmodules -x c++-system-header vector 預(yù)編譯標(biāo)準(zhǔn)頭,再編譯主文件。

六、標(biāo)準(zhǔn)庫模塊:C++23 的大殺器

C++23 擴(kuò)展支持 import std; 或 import <vector>;,但目前各編譯器實(shí)現(xiàn)差異大:

import std.core;  // C++23
import <vector>;  // 部分編譯器支持

典型坑:import <vector> 編譯通過,鏈接時(shí)報(bào) undefined reference —— 說明 BMI 與鏈接時(shí)的庫 ABI 不匹配。Clang 下必須配合 -stdlib=libc++ 使用。

建議:別從 std 開始試,先寫自己的模塊。

七、踩坑指南:這些錯(cuò)誤你一定會(huì)遇到

錯(cuò)誤現(xiàn)象原因解決方案
import std; 報(bào) "module not found"標(biāo)準(zhǔn)庫模塊未預(yù)編譯先用自己的模塊練手
export template<typename T> void foo() {...} 警告不能導(dǎo)出未實(shí)例化的模板定義只導(dǎo)出聲明,實(shí)現(xiàn)放模塊內(nèi)部
鏈接時(shí)報(bào) ODR 違規(guī)跨模塊特化模板時(shí)定義不在同一單元特化聲明和定義必須在同一模塊
移動(dòng)文件后 BMI 失效BMI 包含絕對(duì)路徑和編譯器哈希清理編譯緩存重新構(gòu)建
#include 出現(xiàn)在 .ixx 中模塊接口單元禁止包含頭文件用 import 替代 #include

八、什么時(shí)候該用 Modules?

場(chǎng)景建議
新項(xiàng)目強(qiáng)烈推薦直接用 Modules,別回頭
內(nèi)部工具庫優(yōu)先封裝(數(shù)學(xué)庫、字符串工具等),收益立竿見影
大型遺留項(xiàng)目逐步遷移高頻頭文件,別一次性全改
標(biāo)準(zhǔn)庫暫時(shí)別碰,等 C++23 生態(tài)成熟

CMake 3.28+ 已支持 target_compile_features(... PRIVATE cxx_modules) 和 add_module(),構(gòu)建系統(tǒng)正在跟上。

九、一句話總結(jié)

Modules 不是讓 #include 換個(gè)寫法,而是讓"包含"這個(gè)動(dòng)作本身消失。

它用二進(jìn)制接口緩存替代文本復(fù)制,用顯式導(dǎo)入替代隱式依賴,用編譯期契約替代預(yù)處理器魔術(shù)。編譯速度從平方級(jí)降到線性級(jí),命名沖突和循環(huán)包含成為歷史名詞。

C++ 終于有了與 Python import、Go import、Rust mod 同級(jí)別的模塊系統(tǒng)。

頭文件的時(shí)代,結(jié)束了。

到此這篇關(guān)于C++20 Modules模塊的使用小結(jié)的文章就介紹到這了,更多相關(guān)C++20 Modules 模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中缺省參數(shù)的使用

    C++中缺省參數(shù)的使用

    C++缺省參數(shù)可在聲明或定義時(shí)設(shè)定默認(rèn)值,調(diào)用時(shí)若未提供實(shí)參則自動(dòng)使用,分為全缺省與半缺省,下面就來詳細(xì)的介紹一下缺省參數(shù)的使用,感興趣的可以了解一下
    2025-07-07
  • C++實(shí)現(xiàn)圖書館管理系統(tǒng)源碼

    C++實(shí)現(xiàn)圖書館管理系統(tǒng)源碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書館管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言中程序如何調(diào)用Python腳本

    C語言中程序如何調(diào)用Python腳本

    由于python有很多功能強(qiáng)大的開源庫,有時(shí)候在寫C語言程序的時(shí)候又想利用一下python強(qiáng)大的模塊,那么C語言中程序如何調(diào)用Python腳本,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C/C++實(shí)現(xiàn)的游戲角色名稱名字隨機(jī)生成代碼

    C/C++實(shí)現(xiàn)的游戲角色名稱名字隨機(jī)生成代碼

    這篇文章主要介紹了C/C++實(shí)現(xiàn)的游戲角色名稱名字隨機(jī)生成代碼,本文特別針對(duì)一些古典游戲的角色名稱進(jìn)行隨機(jī)生成,需要的朋友可以參考下
    2015-05-05
  • C++20 新特性 協(xié)程 Coroutines(2)

    C++20 新特性 協(xié)程 Coroutines(2)

    上篇文章簡單給大介紹了 C++20 特性 協(xié)程 Coroutines co_yield 和 co_return 那么這篇文章繼續(xù)給大家介紹C++20 的新特性協(xié)程 Coroutines co_await,需要的朋友可以參考一下
    2021-10-10
  • C++實(shí)現(xiàn)AVL樹的示例詳解

    C++實(shí)現(xiàn)AVL樹的示例詳解

    AVL Tree 是一個(gè)「加上了額外平衡條件」的二叉搜索樹,其平衡條件的建立是為了確保整棵樹的深度為O(log_2N),本文主要介紹了AVL樹的實(shí)現(xiàn),需要的可以參考一下
    2023-03-03
  • C語言嵌入式實(shí)現(xiàn)支持浮點(diǎn)輸出的printf示例詳解

    C語言嵌入式實(shí)現(xiàn)支持浮點(diǎn)輸出的printf示例詳解

    這篇文章主要為大家介紹了C語言嵌入式實(shí)現(xiàn)支持浮點(diǎn)輸出的printf示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 探討++i與i++哪個(gè)效率更高

    探討++i與i++哪個(gè)效率更高

    i++總是要?jiǎng)?chuàng)建一個(gè)臨時(shí)對(duì)象,在退出函數(shù)時(shí)還要銷毀它,而且返回臨時(shí)對(duì)象的值時(shí)還會(huì)調(diào)用其拷貝構(gòu)造函數(shù)
    2013-10-10
  • VS2022連接sqlserver數(shù)據(jù)庫教程

    VS2022連接sqlserver數(shù)據(jù)庫教程

    本文主要介紹了VS2022連接sqlserver數(shù)據(jù)庫教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C語言多種方法實(shí)現(xiàn)一個(gè)函數(shù)左旋字符串中K個(gè)字符

    C語言多種方法實(shí)現(xiàn)一個(gè)函數(shù)左旋字符串中K個(gè)字符

    這篇文章主要為大家介紹了C語言多種方法實(shí)現(xiàn)一個(gè)函數(shù),可以左旋字符串中K個(gè)字符,文中附含詳細(xì)的示例講解,有需要的朋友可以借鑒參考下
    2021-10-10

最新評(píng)論

江山市| 洛川县| 洛南县| 比如县| 德州市| 保山市| 和田县| 塔城市| 马边| 大港区| 崇明县| 大洼县| 平顺县| 五家渠市| 大足县| 大埔县| 东乌珠穆沁旗| 磐安县| 栾城县| 峨边| 阳朔县| 福安市| 河北省| 海口市| 修水县| 法库县| 荆门市| 洪洞县| 汝城县| 乌鲁木齐市| 疏附县| 淳安县| 拉萨市| 四会市| 蒲城县| 翼城县| 金寨县| 西畴县| 福海县| 晋中市| 高密市|