2017-07-28 13 views
2

例:それは意志、私のプロジェクトで頻繁に使用されているようになどのstd ::ベクトル、のstd ::ベクトルとしてのベクトルの少数の例として、プリコンパイル済みヘッダーのテンプレートをインスタンス化すると、コンパイル時間が短縮されますか?

#include <vector> 

: は、私は私のプリコンパイル済みヘッダーファイルに含める言います私はこのようなprecomiledヘッダにだけでなく、それらをインスタンス化した場合にコンパイル時間を短縮:

さらに行く
#include <vector> 
template class std::vector<float>; 
template class std::vector<int>; 

、それもいくつかの関数を使用してプリコンパイル済みヘッダーにダミー関数を追加する意味を行います:

namespace pch_detail { 
inline auto func() { 
    auto&& v = std::vector<float>{}; 
    v.size(); 
    v.begin(); 
    v.front(); 
} 
} 

翻訳単位とテンプレートが実際にどのように機能するかは非常にわかりません。そのため、プリコンパイルされたヘッダーでインスタンス化すると、すべての.cppファイルに対してインスタンス化する必要はありません。

更新

のVisual Studio 2017と実世界のコードベースと一般的に使用されるテンプレートクラスのいくつかのインスタンスでテスト。インスタンス化せずに71731ミリ秒

  • :インスタンス化された共通テンプレートクラスで

    1. したがって68544ミリ秒

    、少なくとも私の場合、それはより多くの時間を要した少しかかりました。

  • +0

    本当にあなたが解決する必要がある問題をコンパイル時ですか?前回私がこのような問題を抱えていたのは1993年でした。 – EJP

    +0

    はい、それは私がこれまで働いていたすべての会社にありました。また、私が知っているC++を使用しているすべての企業。 –

    答えて

    3

    違いがあります。

    翻訳単位でインスタンス化すると、プリコンパイル済みヘッダーのデータが悪用され、コンパイラーはC++標準ライブラリー・ヘッダーよりも速くそれを読み取ることができます。

    しかし、インスタンス化のリストを維持する必要があります。このコンパイル時の最適化は、それ以上の問題になる可能性があります。インスタンス化が不要になった場合、その考え方が逆になる可能性があります。

    3

    おかしい事が、少なくともclang用(4.0.1)バリアント増加コンパイル時間:

    1. no pch 
    
    real 0m0,361s 
    user 0m0,340s 
    sys  0m0,021s 
    
    2. pch, no explicit instantiate 
    
    real 0m0,297s 
    user 0m0,280s 
    sys  0m0,017s 
    
    3. pch, explicit instantiate 
    
    real 0m0,507s 
    user 0m0,474s 
    sys  0m0,033s 
    

    私は、このようなコードを使用します。

    #include <iostream> 
    #include "test.h" 
    
    int main() { 
         std::vector<float> a = {1., 2., 3.}; 
         for (auto &&e : a) { 
           std::cout << e << "\n"; 
         } 
         std::vector<int> b = {1, 2, 3}; 
         for (auto &&e : b) { 
           std::cout << e << "\n"; 
         } 
    } 
    

    ケース2 TEST.H

    #pragma once 
    
    #include <vector> 
    

    ケース3

    #pragma once 
    
    #include <vector> 
    template class std::vector<float>; 
    template class std::vector<int>; 
    

    と、このようなコンパイルスクリプト:

    echo "no pch" 
    time clang++ -std=c++11 main.cpp 
    
    echo "pch, no explicit instantiate" 
    clang++ -std=c++11 -x c++-header test.h -o test.pch 
    time clang++ -std=c++11 -include-pch test.pch main.cpp 
    
    echo "pch, explicit instantiate" 
    clang++ -std=c++11 -x c++-header test2.h -o test2.pch 
    time clang++ -std=c++11 -include-pch test2.pch main2.cpp 
    
    +0

    プリコンパイル済みヘッダーを1回使用することは、このアイデアの悪用ですが、これは素晴らしい分析です。 upvoteを持ってください! – Bathsheba

    +0

    しかし、1000を使用する場合はどうなりますか?cppファイル? –

    +0

    @ViktorSehr '.cpp'ファイルのコンパイルは別のプロセスなので、' 1000'の数字を掛け合わせるだけで、コアの数を分けて番号を取得します。 – fghj

    関連する問題