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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
カスタマーサクセス業務を変革したヘルススコアの実現と学び
_hummer0724
0
650
KIKI_MBSD Cybersecurity Challenges 2025
ikema
0
1.3k
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
190
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
300
CSC307 Lecture 01
javiergs
PRO
0
690
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
680
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
100
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
110
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
500
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
200
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
0
920
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
2.3k
Featured
See All Featured
A Soul's Torment
seathinner
5
2.2k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.4k
Code Reviewing Like a Champion
maltzj
527
40k
Site-Speed That Sticks
csswizardry
13
1.1k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
910
So, you think you're a good person
axbom
PRO
2
1.9k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
96
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