Upload
Download free for 30 days
Login
Submit Search
続・モジュール / Introduction to C++ modules (part 2)
2 likes
847 views
T
TetsuroMatsumura
C++MIX7 「続・モジュール」発表資料 Presentation material used in C++MIX7
Software
Read more
1 of 21
Download now
Download to read offline
1
2
3
Most read
4
5
6
Most read
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
More Related Content
PDF
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
TetsuroMatsumura
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
PPTX
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
PDF
オンラインゲームの仕組みと工夫
Yuta Imai
PDF
プログラムの処方箋~健康なコードと病んだコード
Shigenori Sagawa
PPTX
ゲーム開発とMVC
Takashi Komada
PPTX
C#とILとネイティブと
信之 岩永
PDF
分散学習のあれこれ~データパラレルからモデルパラレルまで~
Hideki Tsunashima
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
TetsuroMatsumura
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
オンラインゲームの仕組みと工夫
Yuta Imai
プログラムの処方箋~健康なコードと病んだコード
Shigenori Sagawa
ゲーム開発とMVC
Takashi Komada
C#とILとネイティブと
信之 岩永
分散学習のあれこれ~データパラレルからモデルパラレルまで~
Hideki Tsunashima
What's hot
(20)
PDF
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
PDF
Xbyakの紹介とその周辺
MITSUNARI Shigeo
PPTX
【DL輪読会】GET3D: A Generative Model of High Quality 3D Textured Shapes Learned f...
Deep Learning JP
PDF
C++ マルチスレッド 入門
京大 マイコンクラブ
PDF
マルチコアを用いた画像処理
Norishige Fukushima
PDF
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
PDF
インタフェース完全に理解した
torisoup
PDF
デザイナのためのGit入門
dsuke Takaoka
PDF
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
PPTX
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
Deep Learning JP
PDF
Observableで非同期処理
torisoup
PDF
Pythonによる黒魔術入門
大樹 小倉
PPTX
なぜなにリアルタイムレンダリング
Satoshi Kodaira
PDF
【Unity道場スペシャル 2017札幌】乱数完全マスター
Unity Technologies Japan K.K.
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
PDF
テストを書こう、Unity編
Hiroto Imoto
PPTX
競技プログラミングのためのC++入門
natrium11321
PDF
TLS, HTTP/2演習
shigeki_ohtsu
PDF
Constexpr 中3女子テクニック
Genya Murakami
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
Xbyakの紹介とその周辺
MITSUNARI Shigeo
【DL輪読会】GET3D: A Generative Model of High Quality 3D Textured Shapes Learned f...
Deep Learning JP
C++ マルチスレッド 入門
京大 マイコンクラブ
マルチコアを用いた画像処理
Norishige Fukushima
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
インタフェース完全に理解した
torisoup
デザイナのためのGit入門
dsuke Takaoka
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
Deep Learning JP
Observableで非同期処理
torisoup
Pythonによる黒魔術入門
大樹 小倉
なぜなにリアルタイムレンダリング
Satoshi Kodaira
【Unity道場スペシャル 2017札幌】乱数完全マスター
Unity Technologies Japan K.K.
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
テストを書こう、Unity編
Hiroto Imoto
競技プログラミングのためのC++入門
natrium11321
TLS, HTTP/2演習
shigeki_ohtsu
Constexpr 中3女子テクニック
Genya Murakami
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
Ad
Similar to 続・モジュール / Introduction to C++ modules (part 2)
(20)
PDF
Code ignitertalk 01
Takako Miyagawa
PPTX
2015 0227 OSC-Spring Tokyo NETMF
Atomu Hidaka
PDF
The Twelve-Factor (A|M)pp with C#
Yuta Matsumura
PDF
Code igniterでテスト駆動開発 資料作成中
Takako Miyagawa
PPTX
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
PDF
osakapy 2014.05 LT
Hattori Hideo
PDF
バージョン管理システムチュートリアル
Ryo Igarashi
PDF
【de:code 2020】 リモートワークの端末を安全に使ってもらおう どこがパワフル Microsoft Endpoint Manager の Wi...
日本マイクロソフト株式会社
PDF
はじめてのCodeIgniter
Yuya Matsushima
PDF
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
NTT DATA Technology & Innovation
PDF
.NET Core時代のCI/CD
Yuta Matsumura
PDF
Clang Modules
Wataru Kimura
PDF
Rtミドルウェア講習会 第2部資料
openrtm
PDF
Tekton 入門
Mamoru Shimizu
PDF
Prometheus超基礎公開用.pdf
勇 黒沢
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
PDF
環境構築自動化ツールのご紹介
Etsuji Nakai
PPTX
GithubAction+DevOpsCenter.pptx
furuCRM株式会社 CEO/Dreamforce Vietnam Founder
PDF
FPGAアクセラレータの作り方 (IBM POWER+CAPI編)
Mr. Vengineer
PDF
.NETラボ 勉強会 2021年1月 「C#で機械学習」
Fujio Kojima
Code ignitertalk 01
Takako Miyagawa
2015 0227 OSC-Spring Tokyo NETMF
Atomu Hidaka
The Twelve-Factor (A|M)pp with C#
Yuta Matsumura
Code igniterでテスト駆動開発 資料作成中
Takako Miyagawa
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
osakapy 2014.05 LT
Hattori Hideo
バージョン管理システムチュートリアル
Ryo Igarashi
【de:code 2020】 リモートワークの端末を安全に使ってもらおう どこがパワフル Microsoft Endpoint Manager の Wi...
日本マイクロソフト株式会社
はじめてのCodeIgniter
Yuya Matsushima
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
NTT DATA Technology & Innovation
.NET Core時代のCI/CD
Yuta Matsumura
Clang Modules
Wataru Kimura
Rtミドルウェア講習会 第2部資料
openrtm
Tekton 入門
Mamoru Shimizu
Prometheus超基礎公開用.pdf
勇 黒沢
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
環境構築自動化ツールのご紹介
Etsuji Nakai
GithubAction+DevOpsCenter.pptx
furuCRM株式会社 CEO/Dreamforce Vietnam Founder
FPGAアクセラレータの作り方 (IBM POWER+CAPI編)
Mr. Vengineer
.NETラボ 勉強会 2021年1月 「C#で機械学習」
Fujio Kojima
Ad
続・モジュール / 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