Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Try C++ module! - meetup app osaka@5

Try C++ module! - meetup app osaka@5

0eb58d770d6e4766150ef7cb6cdce3c7?s=128

Akiko Kawai

January 29, 2021
Tweet

Transcript

  1. / Try C++ module! Try C++ module! 2021/1/30 Sat meetupapp

    osaka @5 遥佐保(はるかさお) 
  2. / 今⽇のお題 

  3. / C++20 modules C++20 modules C++20 で新たに導⼊される module … #include

    の代替え⼿段とのことで期待⼤です… これまでのC++のコードの構造と アーキテクチャに ⼤きな影響を与える機能なんじゃ ないかな〜と思います 
  4. / ビルドの流れのおさらい ビルドの流れのおさらい C++のコードから実際に実⾏形式ができるまでの概念 

  5. / そのうち今回関係あるもの プリプロセッサ ヘッダーとソースファイルの分割 コンパイルが開始される前に 翻訳単位(コンパイルの単位)ごとに処理 

  6. / includeの何が問題なの︖ includeの何が問題なの︖ #include “foo.h” はファイルの⽂字列内容を 展開してるだけで、⽂法的な意味はない C# の using

    に似てるように⾒えるかもだが全然違う // foo.h class FOO{ int f; }; // main.cpp #include "foo.h" FOO F; 
  7. / <ヘッダーファイルの問題> include する順番の考慮 複数回定義対応のインクルードガード STLなど複雑なテンプレートのコンパイル時間が ⻑くなる そこで module の登場です︕

  8. / module にするメリット module にするメリット コンパイルされたバイナリに出来る PCHと似たような機能(正式に標準化) export で明⽰的に公開してるものだけが import

    で利⽤できる(副作⽤が無い) 既存のヘッダーファイルと共存が可能 
  9. / moduleファイルのサンプル // moduleファイル // 拡張子はなんでも良いけどVC++的には .ixxとしてるみたい // 他のサンプルだと .cppm

    が多そう // モジュール名を定義し、それをインポートできるようにします export module NumberCruncher; // module内部で他のmoduleもinport出来る import logger; // module内のマクロは公開されない(汚染がない) #define CRUNCH_FACTOR 3.14 
  10. / moduleファイルのサンプル(続き) namespace numbers { // ↓↓↓明示的にexportされてないので、import側では利用できない float applyCrunchFactor(float number)

    { return number * CRUNCH_FACTOR; } // exportキーワードを書いて、importで利用できるようにする // (これは実装をここに書いてるパターン、他のファイルに実装を分割もできる) export float crunch(float number) { // 内部関数を利用 auto crunched = applyCrunchFactor(number); // 他のmoduleの関数を利用 logger::info("Crunched {} with result of {}", number, crunche return crunched; } } 
  11. / module を利⽤する側 // main.cpp import NumberCruncher; // カスタムmoduleのインポート int

    main() { auto value = numbers::crunch(42); } 
  12. / moduleのデメリット moduleのデメリット (と思われている点) includeによるヘッダーファイルの展開がないの で、コンパイル時の解析が早くなるはず… 逆に⾔うと、モジュールの依存関係準にコン パイルする必要があり(今まで出来ていた) コンパイルの並列化がしにくい (普通のPCでビルドする分には早くなると思う

    分散環境構築のIncrediBuildさん等は 考慮が必要そうな予感) 
  13. / 今回は最初の使い⽅のみの紹介でした 実際に module を利⽤しようと思ったら 新規概念の「到達可能(Reachable)」の理解や 意図しないODR違反などが出る可能性など 考慮すべき項⽬は多そうです 

  14. / 参考 C++20 in 2020: Modules - Inside PSPDFKit   Current

    Status - isocpp A Tour of C++ Modules in Visual Studio - C++ Tema Blog https://pspdfkit.com/blog/2020/cpp20-in-2020- modules/ https://isocpp.org/std/status https://devblogs.microsoft.com/cppblog/a-tour-of- cpp-modules-in-visual-studio/ 
  15. / C++ のモジュールの概要 - Microsoft Docs モジュール - cpprefjp [C++]モジュール理論

    基礎編 - 地⾯を⾒下ろす少年 の⾜蹴にされる私 https://docs.microsoft.com/ja-jp/cpp/cpp/modules- cpp?view=msvc-160 https://cpprefjp.github.io/lang/cpp20/modules.html https://onihusube.hatenablog.com/entry/2019/07/07   