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
18
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
Back to the Future: Let me tell you about the ACP protocol
terhechte
0
120
Local Peer-to-Peer APIはどのように使われていくのか?
hal_spidernight
2
410
Platformに“ちょうどいい”責務ってどこ? 関心の熱さにあわせて考える、責務分担のプラクティス
estie
2
510
育てるアーキテクチャ:戦い抜くPythonマイクロサービスの設計と進化戦略
fujidomoe
1
140
クラシルを支える技術と組織
rakutek
0
190
LLMとPlaywright/reg-suitを活用した jQueryリファクタリングの実際
kinocoboy2
4
640
TokyoR#119 bignners session2 Visualization
kotatyamtema
0
130
気づいて!アプリからのSOS 〜App Store Connect APIで始めるパフォーマンス健康診断〜
waka12
0
250
ててべんす独演会〜Flowの全てを語ります〜
tbsten
1
220
ネイティブ製ガントチャートUIを作って学ぶUICollectionViewLayoutの威力
jrsaruo
0
110
Learn CPU architecture with Assembly
akkeylab
1
1.3k
Чего вы не знали о строках в Python – Василий Рябов, PythoNN
sobolevn
0
150
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
30
2.9k
How to Think Like a Performance Engineer
csswizardry
27
2k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.1k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.7k
The Cost Of JavaScript in 2023
addyosmani
53
9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.6k
It's Worth the Effort
3n
187
28k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
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