Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C++20 modules

Avatar for mai mai
August 01, 2025

C++20 modules

https://zenn.dev/mai/scraps/c5ac3e77778446 をスライド形式にまとめたものです。
情報は2024/10時点から更新されていません。

Avatar for mai

mai

August 01, 2025
Tweet

Other Decks in Programming

Transcript

  1. Index 話すこと • C++規格について • Module の利点 • Precompiled header

    話さないこと • Module の実⽤的な使い⽅ • 詳細な仕様
  2. Note 本スライドは C++20 Modules の積極的な利⽤を 推奨するものではない • 今は使わないほうが良い • Google

    C++ Style Guide「Do not use C++20 Modules.」 規格で定義されたものと処理系依存を混ぜて説明することがある
  3. Reference - GCC https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Modules.ht ml - Clang https://clang.llvm.org/docs/StandardCPlusPlusModules.html - C++

    ⽇本語リファレンス https://cpprefjp.github.io/lang/cpp20/modules.html - Standard for Programming Language C++ https://isocpp.org/files/papers/N4861.pdf
  4. Environment • Ubuntu 22.04 • Clang LLVM 19.1.0 • ❌

    Ubuntu 22.04 の apt から取得できるもの (clang 14) 致命的なバグあり
  5. C++ standard • 3 年ごとに更新 ◦ C++20 ← 2020年 •

    C++11 と C++20 は⼤型アップデートと呼ばれがち (本当にかゆいところに⼿が届くのは次のバージョンから) C++11 • constexpr • 右辺値参照 • スマートポインタ C++20 • coroutine • concept • module
  6. C++ standard • 3 年ごとに更新 ◦ C++20 ← 2020年 •

    C++11 と C++20 は⼤型アップデートと呼ばれがち (本当にかゆいところに⼿が届くのは次のバージョンから) C++11 • constexpr • 右辺値参照 • スマートポインタ C++20 • coroutine • concept • module C++23 • 標準ライブラリ module 化
  7. C++ sample code (module style) 翻訳単位(translation unit) - グローバルモジュールフラグメント (global

    module fragment) - モジュールを使⽤しない部分 - プライマリモジュールインターフェース (primary module interface) - ヘッダの置換となる翻訳単位 - モジュール実装ユニット (module implementation unit) - 実装の置換となる翻訳単位 (他にもある)(パーティションとか)
  8. C++ sample code (module style) global module fragment 従来の形式のヘッダをインクルードする main関数

    primary module interface ヘッダに相当 module implementation unit 実装に相当
  9. Precompiled header • GCC は gch、clang は pch • ヘッダファイルと同じ場所に⽣成

    CMake 等で⾃動⽣成したヘッダファイルを PCH する hello.cpp hello.h main.cpp hello.o main.o ./main hello.h.gch
  10. Compile modules Precompiled header のビルドに酷似 ⽣成されたファイルは Built Module Interface (BMI)

    と呼ばれる ※ GCC では Compiled Module Interface (CMI) hello.cpp hello.cppm main.cpp hello.o main.o ./main hello.pcm
  11. Summary • ヘッダは include される度に解析される • Precompiled Headers (処理系依存) ヘッダを事前にビルドしてビルド時間を⾼速化する

    • モジュールは、Precompiled Headers を扱いやすくしたもの • モジュールのインターフェースは BMI と呼ばれる 中間ファイルに変換される
  12. おまけ: Linkage • No linkage ◦ 関数スコープ内で定義されるものなど • Internal linkage

    ◦ static int v; 翻訳単位の外からアクセスできない • External linkage ◦ int v; 外部からアクセスできる • Module Linkage (追加) ◦ モジュールのみ公開
  13. おまけ: Linkage • Module Linkage (追加) ◦ モジュール内のみで利⽤可能 ◦ シンボルは公開される

    (External linkage) ▪ dlopen, dlsym で参照可能 ▪ ChatGPTは隠せるとか⾔ってくるので注意
  14. end