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

Akiko Kawai

January 29, 2021
Tweet

More Decks by Akiko Kawai

Other Decks in Programming

Transcript

  1. /
    Try C++ module!
    Try C++ module!
    2021/1/30 Sat
    meetupapp osaka @5
    遥佐保(はるかさお)

    View full-size slide

  2. /
    今⽇のお題

    View full-size slide

  3. /
    C++20 modules
    C++20 modules
    C++20 で新たに導⼊される module …
    #include の代替え⼿段とのことで期待⼤です…
    これまでのC++のコードの構造と
    アーキテクチャに
    ⼤きな影響を与える機能なんじゃ
    ないかな〜と思います

    View full-size slide

  4. /
    ビルドの流れのおさらい
    ビルドの流れのおさらい
    C++のコードから実際に実⾏形式ができるまでの概念

    View full-size slide

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

    View full-size slide

  6. /
    includeの何が問題なの︖
    includeの何が問題なの︖
    #include “foo.h” はファイルの⽂字列内容を
    展開してるだけで、⽂法的な意味はない
    C# の using に似てるように⾒えるかもだが全然違う
    // foo.h
    class FOO{
    int f;
    };
    // main.cpp
    #include "foo.h"
    FOO F;

    View full-size slide

  7. /
    <ヘッダーファイルの問題>
    include する順番の考慮
    複数回定義対応のインクルードガード
    STLなど複雑なテンプレートのコンパイル時間が
    ⻑くなる
    そこで module の登場です︕

    View full-size slide

  8. /
    module にするメリット
    module にするメリット
    コンパイルされたバイナリに出来る
    PCHと似たような機能(正式に標準化)
    export で明⽰的に公開してるものだけが import
    で利⽤できる(副作⽤が無い)
    既存のヘッダーファイルと共存が可能

    View full-size slide

  9. /
    moduleファイルのサンプル
    // moduleファイル
    // 拡張子はなんでも良いけどVC++的には .ixxとしてるみたい
    // 他のサンプルだと .cppm が多そう
    // モジュール名を定義し、それをインポートできるようにします
    export module NumberCruncher;
    // module内部で他のmoduleもinport出来る
    import logger;
    // module内のマクロは公開されない(汚染がない)
    #define CRUNCH_FACTOR 3.14

    View full-size slide

  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;
    }
    }

    View full-size slide

  11. /
    module を利⽤する側
    // main.cpp
    import NumberCruncher; // カスタムmoduleのインポート
    int main() {
    auto value = numbers::crunch(42);
    }

    View full-size slide

  12. /
    moduleのデメリット
    moduleのデメリット
    (と思われている点)
    includeによるヘッダーファイルの展開がないの
    で、コンパイル時の解析が早くなるはず…
    逆に⾔うと、モジュールの依存関係準にコン
    パイルする必要があり(今まで出来ていた)
    コンパイルの並列化がしにくい
    (普通のPCでビルドする分には早くなると思う
    分散環境構築のIncrediBuildさん等は
    考慮が必要そうな予感)

    View full-size slide

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

    View full-size slide

  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/

    View full-size slide

  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
     

    View full-size slide