Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C++20 modules
Search
mai
August 01, 2025
Programming
0
36
C++20 modules
https://zenn.dev/mai/scraps/c5ac3e77778446
をスライド形式にまとめたものです。
情報は2024/10時点から更新されていません。
mai
August 01, 2025
Tweet
Share
Other Decks in Programming
See All in Programming
CSC307 Lecture 05
javiergs
PRO
0
500
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
110
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
190
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.3k
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
400
CSC307 Lecture 09
javiergs
PRO
1
830
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
190
AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話
azukiazusa1
1
710
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
200
AI時代のキャリアプラン「技術の引力」からの脱出と「問い」へのいざない / tech-gravity
minodriven
20
7.1k
360° Signals in Angular: Signal Forms with SignalStore & Resources @ngLondon 01/2026
manfredsteyer
PRO
0
120
Featured
See All Featured
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
0
2.3k
Thoughts on Productivity
jonyablonski
74
5k
Typedesign – Prime Four
hannesfritz
42
2.9k
Skip the Path - Find Your Career Trail
mkilby
0
53
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.4k
How to Think Like a Performance Engineer
csswizardry
28
2.4k
Evolving SEO for Evolving Search Engines
ryanjones
0
120
WENDY [Excerpt]
tessaabrams
9
36k
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
It's Worth the Effort
3n
188
29k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.9k
Transcript
C++20 Modules https://github.com/buyoh
補足 本スライドは以下の記事を纏めたものです https://zenn.dev/mai/scraps/c5ac3e77778446
Index 話すこと • C++規格について • Module の利点 • Precompiled header
話さないこと • Module の実⽤的な使い⽅ • 詳細な仕様
Note 本スライドは C++20 Modules の積極的な利⽤を 推奨するものではない • 今は使わないほうが良い • Google
C++ Style Guide「Do not use C++20 Modules.」 規格で定義されたものと処理系依存を混ぜて説明することがある
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
Environment • Ubuntu 22.04 • Clang LLVM 19.1.0 • ❌
Ubuntu 22.04 の apt から取得できるもの (clang 14) 致命的なバグあり
C++ standard • 3 年ごとに更新 ◦ C++20 ← 2020年 •
C++11 と C++20 は⼤型アップデートと呼ばれがち (本当にかゆいところに⼿が届くのは次のバージョンから) C++11 • constexpr • 右辺値参照 • スマートポインタ C++20 • coroutine • concept • module
C++ standard • 3 年ごとに更新 ◦ C++20 ← 2020年 •
C++11 と C++20 は⼤型アップデートと呼ばれがち (本当にかゆいところに⼿が届くのは次のバージョンから) C++11 • constexpr • 右辺値参照 • スマートポインタ C++20 • coroutine • concept • module C++23 • 標準ライブラリ module 化
C++ Modules ⼀⾔で説明すると: ヘッダーファイル‧ソースファイルに代わる 新たなファイル分割の仕組み
C++ sample code (header style) hello.cpp hello.h main.cpp ライブラリ ユーザコード
C++ sample code (header style) ビルドコマンド hello.cpp main.cpp hello.o main.o
./main
ライブラリ ユーザコード C++ sample code (module style) ※拡張⼦は開発環境(MSVC/Clang/GCC)で異なる example.hello .cpp
example.hello .cppm main.cpp
C++ sample code (module style) 翻訳単位(translation unit) - グローバルモジュールフラグメント (global
module fragment) - モジュールを使⽤しない部分 - プライマリモジュールインターフェース (primary module interface) - ヘッダの置換となる翻訳単位 - モジュール実装ユニット (module implementation unit) - 実装の置換となる翻訳単位 (他にもある)(パーティションとか)
C++ sample code (module style) global module fragment 従来の形式のヘッダをインクルードする main関数
primary module interface ヘッダに相当 module implementation unit 実装に相当
C++ sample code (module style) インターフェースのプリコンパイルが必要 pcm のファイル名はモジュール名前と同じにする
C++ sample code (module style) インターフェースのプリコンパイルが必要 pcm のファイル名はモジュール名前と同じにする → プリコンパイル済みファイルを探すため
Summary • C++20 について • ファイル分割されたC++コードのビルド⽅法 • ヘッダファイル形式とモジュール形式の違い ◦ オブジェクトファイルとソースファイルの関係について、
⼤きな違いはない
Merit • #include を書かなくて良い!!! • モジュールリンケージの追加で可視
#include preprocessor directive ⾏にテキストファイルを挿⼊する
#include preprocessor directive ⾏にテキストファイルを挿⼊する 悪⽤例 適⽤後コンパイルエラーにならなければok objcopy を使うべき
#include preprocessor directive デメリット include される度にソースコードを解析しなければならない hello.cpp hello.h main.cpp hello.o
main.o ./main 2回解析される
Precompiled header コンパイラ独⾃機能 事前にヘッダを中間ファイル(Precompiled header)にビルドする キャッシュファイルで、オブジェクトファイルではない hello.cpp hello.h main.cpp hello.o
main.o ./main hello.h.pch
Precompiled header • GCC は gch、clang は pch • ヘッダファイルと同じ場所に⽣成
CMake 等で⾃動⽣成したヘッダファイルを PCH する hello.cpp hello.h main.cpp hello.o main.o ./main hello.h.gch
Compile modules module 機能を使うと Precompiled header の利点が得られる
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
Compile modules BMI ⽣成後であってもソースコードは参照される コンパイルに必要 hello.cppm main.cpp main.o hello.pcm
Summary • ヘッダは include される度に解析される • Precompiled Headers (処理系依存) ヘッダを事前にビルドしてビルド時間を⾼速化する
• モジュールは、Precompiled Headers を扱いやすくしたもの • モジュールのインターフェースは BMI と呼ばれる 中間ファイルに変換される
おまけ: Linkage • No linkage ◦ 関数スコープ内で定義されるものなど • Internal linkage
◦ static int v; 翻訳単位の外からアクセスできない • External linkage ◦ int v; 外部からアクセスできる • Module Linkage (追加) ◦ モジュールのみ公開
おまけ: Linkage • Module Linkage (追加) ◦ モジュール内のみで利⽤可能 ◦ シンボルは公開される
(External linkage) ▪ dlopen, dlsym で参照可能 ▪ ChatGPTは隠せるとか⾔ってくるので注意
おまけ: Symbols シンボルにモジュールの情報が含まれるようになる nmで参照できるデマングル後のシンボル名は次のように変化: エクスポートしたものの直後に「@モジュール名」が追加 例: Table クラスをエクスポート base::
[email protected]
::operator()(int, int)
end