Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
C++20 modules
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
mai
August 01, 2025
Programming
84
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
C++20 modules
https://zenn.dev/mai/scraps/c5ac3e77778446
をスライド形式にまとめたものです。
情報は2024/10時点から更新されていません。
mai
August 01, 2025
Other Decks in Programming
See All in Programming
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
2
570
Simple Storage Service(S3) is not simple
iwatsukayura
0
290
phperだってパンチカードでコーディングしたい
o0h
PRO
0
340
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
390
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
140
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
130
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
260
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.6k
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
120
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
790
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.7k
Featured
See All Featured
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
The Curse of the Amulet
leimatthew05
3
16k
Six Lessons from altMBA
skipperchong
29
4.5k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
630
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
410
Amusing Abliteration
ianozsvald
1
350
Speed Design
sergeychernyshev
33
2.2k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
A better future with KSS
kneath
240
18k
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