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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
260
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
190
AtCoder Conference 2025
shindannin
0
1.1k
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
4.4k
2026年 エンジニアリング自己学習法
yumechi
0
130
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.4k
CSC307 Lecture 06
javiergs
PRO
0
680
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
230
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.5k
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
400
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
Featured
See All Featured
Abbi's Birthday
coloredviolet
1
4.7k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
160
Discover your Explorer Soul
emna__ayadi
2
1.1k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
Between Models and Reality
mayunak
1
180
How to Talk to Developers About Accessibility
jct
2
130
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
80
The agentic SEO stack - context over prompts
schlessera
0
630
KATA
mclloyd
PRO
34
15k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.7k
Everyday Curiosity
cassininazir
0
130
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
170
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