Submit Search
Upload
続・モジュール / Introduction to C++ modules (part 2)
•
2 likes
•
804 views
T
TetsuroMatsumura
Follow
C++MIX7 「続・モジュール」発表資料 Presentation material used in C++MIX7
Read less
Read more
Software
Slideshow view
Report
Share
Slideshow view
Report
Share
1 of 21
Download now
Download to read offline
Recommended
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
TetsuroMatsumura
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
Takuya Ueda
例外設計における大罪
例外設計における大罪
Takuto Wada
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Masakazu Matsushita
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
Recommended
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
TetsuroMatsumura
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
Takuya Ueda
例外設計における大罪
例外設計における大罪
Takuto Wada
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Masakazu Matsushita
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
はじめてのGit forデザイナー&コーダー
はじめてのGit forデザイナー&コーダー
Saeko Yamamoto
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
脱UniRx&Croutineから始めるUniTask
脱UniRx&Croutineから始めるUniTask
Euglenaching
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
Kohei Nakamura
いつやるの?Git入門
いつやるの?Git入門
Masakazu Matsushita
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
Hajime Yanagawa
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
Unity Technologies Japan K.K.
【Unity道場スペシャル 2017札幌】カッコいい文字を使おう、そうtext meshならね
【Unity道場スペシャル 2017札幌】カッコいい文字を使おう、そうtext meshならね
Unity Technologies Japan K.K.
やりなおせる Git 入門
やりなおせる Git 入門
Tomohiko Himura
Constexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzz
京大 マイコンクラブ
こわくない Git
こわくない Git
Kota Saito
ELFの動的リンク
ELFの動的リンク
7shi
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
Takafumi Yoshida
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
Code ignitertalk 01
Code ignitertalk 01
Takako Miyagawa
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF
Atomu Hidaka
More Related Content
What's hot
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
はじめてのGit forデザイナー&コーダー
はじめてのGit forデザイナー&コーダー
Saeko Yamamoto
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
脱UniRx&Croutineから始めるUniTask
脱UniRx&Croutineから始めるUniTask
Euglenaching
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
Kohei Nakamura
いつやるの?Git入門
いつやるの?Git入門
Masakazu Matsushita
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
Hajime Yanagawa
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
Unity Technologies Japan K.K.
【Unity道場スペシャル 2017札幌】カッコいい文字を使おう、そうtext meshならね
【Unity道場スペシャル 2017札幌】カッコいい文字を使おう、そうtext meshならね
Unity Technologies Japan K.K.
やりなおせる Git 入門
やりなおせる Git 入門
Tomohiko Himura
Constexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzz
京大 マイコンクラブ
こわくない Git
こわくない Git
Kota Saito
ELFの動的リンク
ELFの動的リンク
7shi
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
Takafumi Yoshida
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
What's hot
(20)
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
はじめてのGit forデザイナー&コーダー
はじめてのGit forデザイナー&コーダー
C++ マルチスレッド 入門
C++ マルチスレッド 入門
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
脱UniRx&Croutineから始めるUniTask
脱UniRx&Croutineから始めるUniTask
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
いつやるの?Git入門
いつやるの?Git入門
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
クロージャデザインパターン
クロージャデザインパターン
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
【Unity道場スペシャル 2017札幌】カッコいい文字を使おう、そうtext meshならね
【Unity道場スペシャル 2017札幌】カッコいい文字を使おう、そうtext meshならね
やりなおせる Git 入門
やりなおせる Git 入門
Constexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzz
こわくない Git
こわくない Git
ELFの動的リンク
ELFの動的リンク
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Similar to 続・モジュール / Introduction to C++ modules (part 2)
Code ignitertalk 01
Code ignitertalk 01
Takako Miyagawa
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF
Atomu Hidaka
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#
Yuta Matsumura
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中
Takako Miyagawa
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
osakapy 2014.05 LT
osakapy 2014.05 LT
Hattori Hideo
バージョン管理システムチュートリアル
バージョン管理システムチュートリアル
Ryo Igarashi
【de:code 2020】 リモートワークの端末を安全に使ってもらおう どこがパワフル Microsoft Endpoint Manager の Wi...
【de:code 2020】 リモートワークの端末を安全に使ってもらおう どこがパワフル Microsoft Endpoint Manager の Wi...
日本マイクロソフト株式会社
はじめてのCodeIgniter
はじめてのCodeIgniter
Yuya Matsushima
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
NTT DATA Technology & Innovation
.NET Core時代のCI/CD
.NET Core時代のCI/CD
Yuta Matsumura
Clang Modules
Clang Modules
Wataru Kimura
Rtミドルウェア講習会 第2部資料
Rtミドルウェア講習会 第2部資料
openrtm
Tekton 入門
Tekton 入門
Mamoru Shimizu
Prometheus超基礎公開用.pdf
Prometheus超基礎公開用.pdf
勇 黒沢
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
Etsuji Nakai
GithubAction+DevOpsCenter.pptx
GithubAction+DevOpsCenter.pptx
furuCRM株式会社 CEO/Dreamforce Vietnam Founder
FPGAアクセラレータの作り方 (IBM POWER+CAPI編)
FPGAアクセラレータの作り方 (IBM POWER+CAPI編)
Mr. Vengineer
.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」
Fujio Kojima
Similar to 続・モジュール / Introduction to C++ modules (part 2)
(20)
Code ignitertalk 01
Code ignitertalk 01
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
osakapy 2014.05 LT
osakapy 2014.05 LT
バージョン管理システムチュートリアル
バージョン管理システムチュートリアル
【de:code 2020】 リモートワークの端末を安全に使ってもらおう どこがパワフル Microsoft Endpoint Manager の Wi...
【de:code 2020】 リモートワークの端末を安全に使ってもらおう どこがパワフル Microsoft Endpoint Manager の Wi...
はじめてのCodeIgniter
はじめてのCodeIgniter
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
.NET Core時代のCI/CD
.NET Core時代のCI/CD
Clang Modules
Clang Modules
Rtミドルウェア講習会 第2部資料
Rtミドルウェア講習会 第2部資料
Tekton 入門
Tekton 入門
Prometheus超基礎公開用.pdf
Prometheus超基礎公開用.pdf
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
GithubAction+DevOpsCenter.pptx
GithubAction+DevOpsCenter.pptx
FPGAアクセラレータの作り方 (IBM POWER+CAPI編)
FPGAアクセラレータの作り方 (IBM POWER+CAPI編)
.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」
続・モジュール / Introduction to C++ modules (part 2)
1.
続・モジュール 2020-01-28 C++ MIX #7 Tetsuro
Matsumura
2.
目次 1. モジュールとモジュールユニット 2. モジュールユニットの依存関係 3.
パーティション 4. フラグメント 5. ヘッダーユニット 6. パフォーマンス 7. 実装状況 1
3.
モジュール 2 C++20では、ヘッダーファイルに代わる仕組みとしてモジュールが導入され、 プリプロセッサを用いずにプログラムを分割できる。 // datetime.h #ifndef LIB_DATETIME_H #define
LIB_DATETIME_H #include "core.h" namespace lib { … } #endif // datetime.cpp export module lib.datetime; import lib.core; export namespace lib { … } // main.cpp #include "datetime.h“ int main() { … } // main.cpp import lib.datetime; int main() { … }
4.
モジュールユニットの分類 3 モジュール宣言を含む翻訳単位(モジュールユニット)は、4つに分類できる export module lib.datetime;
module lib.datetime; export module lib.datetime:date; module lib.datetime:dateimpl; モジュール実装ユニット ソースファイルに相当 モジュールインターフェースユニット ヘッダーファイルに相当 パーティション: モジュールを分割するのに使う export module lib.datetime; export module lib.datetime:date;export module lib.datetime:date; module lib.datetime:dateimpl;
5.
モジュールユニットの分類 4 モジュール名が同じなら同じモジュール(モジュールは複数の翻訳単位で構成できる) パーティション名は翻訳単位間でユニーク export module lib.datetime;
module lib.datetime; export module lib.datetime:date; module lib.datetime:dateimpl;
6.
モジュール内の依存関係 5 export module lib.datetime; プライマリーモジュールインターフェースユニット module
lib.datetime; モジュール実装ユニット 暗黙的インポート import lib.datetime; モジュールユニット間のインポートの向きは決まっている(依存の循環は禁止) モジュール lib.datetime ⚫ 外からインポートするのは「インターフェース」。 ⚫ 「インターフェース」ではエクスポート宣言ができる。「実装」ではできない。 ⚫ パーティションでないモジュール実装ユニットは、 プライマリーモジュールインターフェースユニットを暗黙的にインポートする 外部からのインポート
7.
#includeの依存関係 6 lib/datetime.h ヘッダーファイル lib/datetime.cpp ソースファイル #include #include 実は#includeが作る依存関係と同じ モジュール lib/datetime
8.
モジュール内の依存関係(パーティション) 7 export module lib.datetime; プライマリーモジュールインターフェースユニット module
lib.datetime; モジュール実装ユニット export module lib.datetime:date; モジュールインターフェース パーティション module lib.datetime:impl; モジュール実装パーティション 暗黙的インポート 外部からのインポート パーティションは同一モジュール内でインポートできるモジュール(依存の循環は禁止) モジュール lib.datetime
9.
インターフェースパーティションと実装パーティション インターフェースパーティション ⚫ インターフェースを分割するためのもの。エクスポート宣言できる。 ⚫ 必ず再エクスポートする必要がある
= 外から間接的にインポートされる。 実装パーティション ⚫ エクスポート宣言できない。再エクスポートもできない。 ⚫ モジュール内でプライベートに使う共通コードを置く。 module lib.datetime:impl; export module lib.datetime:date;
10.
パーティションはいつ使う? 9 ソースファイルが長いので分けたい場合や、プライベートな物を分けたい場合に適する。 モジュールパーティションの存在は外部からはわからないので、 単独でも使用できるなら、独立したモジュールにしたほうが良い。 export module lib.datetime; export
import :date; export import :time; export module lib.datetime:date; export module lib.datetime:time; export module lib.datetime; export import lib.datetime.date; export import lib.datetime.time; export module lib.datetime.date; export module lib.datetime.time; パーティションで分割: 外からは使えない 別のモジュールに分割: 単独でも使える ※モジュール名にはドットが使えるが、特別な意味はない
11.
フラグメント 10 ファイル(翻訳単位)を分けずにモジュールを分ける機能 ⚫ グローバルモジュールフラグメント グローバルモジュール(モジュールの外側)のコードを書ける。 ⚫ プライベートモジュールフラグメント プライベートなコードを書ける。(外から到達できない)
12.
グローバルモジュールフラグメント 11 モジュール宣言の前にグローバルモジュールの実装を書ける。 ただし、プリプロセッサしか書けない。 モジュール内ではODRの例外がない。#includeするとほぼODR違反。 ※ 同じトークン列ならODR違反にならないという例外 #includeを書く場合、グローバルモジュールフラグメントに書く。 module; #include <iostream> #include
<vector> export module foo; #include "lib.h" //ODR違反!! void f() { std::cout << "foo" << std::endl; } グローバル モジュール モジュール内部
13.
プライベートモジュールフラグメント 12 1ファイルでインターフェースと実装を分ける機能 ※ これを使う場合、モジュールは1つの翻訳単位しか持てない export module
foo; struct foo { foo(); }; module :private; foo::foo(){…} モジュール インターフェース プライベート モジュール フラグメント プライベートモジュールフラグメント内ではエクスポート宣言できない。 外部から到達可能にはならない。 → いわゆる “detail名前空間”に最適
14.
後方互換性のための機能 13 従来のヘッダーファイルによって提供されるライブラリのための機能がある。 ⚫ グローバルモジュールフラグメント モジュール本体への影響が少ないようにインクルードできる機能 ⚫ ヘッダーユニット ヘッダーファイルをモジュールとしてインポートできる機能
15.
ヘッダーユニット 14 一部のヘッダーファイルをモジュールとしてインポートできる機能。 export module foo; import
<iostream>; void f() { std::cout << "foo" << std::endl; } ⚫ 効果は#includeとほぼ同じ(マクロも取り込まれる) ⚫ 別の翻訳単位としてコンパイルされインポートされる ⚫ C++ライブラリヘッダーと処理系定義のヘッダーがインポートできる ※ <cmath>などのC互換ライブラリは不可 処理系によってはユーザーが指定できる ⚫ 処理系は#includeをimportに置換できる
16.
モジュールでビルドは速くなるか 15 モジュールによってビルドが速くなると言われている • #includeと違ってコードが展開されないので、解析が速くなる 一方、かえって遅くなるという主張もある • モジュールの依存関係順にコンパイルする必要があるので、並列化しにくくなる
17.
モジュールのベンチマーク P1441R1 16 モジュールなし モジュールあり 並列数が少ない場合は、モジュールに分けると速くなる
18.
モジュールのベンチマーク P1441R1 17 モジュールなし モジュールあり 並列数が多い場合は依存が複雑だと遅くなる (従来のビルドとは異なる特性)
19.
実装状況 18 すべて実装している処理系はまだ存在しない。 ⚫ モジュールインターフェース、モジュール実装までは動く。 (GCC/Clang/MSVC) Wandboxでも実行可能: https://wandbox.org/permlink/lf6IvzvuFR8voprK ⚫
Visual Studio 2019 16.5でグローバルモジュールフラグメント、パーティション、 ヘッダーユニットが実装。ユーザー指定のヘッダーユニットも動く。 https://devblogs.microsoft.com/cppblog/c-modules-conformance- improvements-with-msvc-in-visual-studio-2019-16-5/
20.
19 まとめ ⚫ #includeに代わる仕組みとしてモジュールが導入された ⚫ プリプロセッサを用いずにプログラムを分割できる ⚫
ファイル構成はそれほど変わらない ヘッダーファイル ≃ モジュールインターフェースユニット ソースファイル ≃ モジュール実装ユニット ⚫ ヘッダーファイルから緩やかに移行できる (ヘッダーユニット) ⚫ モジュールで速くなるかは断言できない ⚫ 実装は進んできている
21.
20 参考リンク ⚫ Working Draft,
Standard for Programming Language C++ - 10. Modules http://eel.is/c++draft/module ⚫ cpprefjp モジュール https://cpprefjp.github.io/lang/cpp20/modules.html ⚫ [C++]モジュール理論 基礎編 https://onihusube.hatenablog.com/entry/2019/07/07/025446 ⚫ [C++]モジュール理論 上級編(魔境編) https://onihusube.hatenablog.com/entry/2019/07/17/183137
Download now