2017-12-14 9 views
3

今日、マトリックスクラスをconstexprに書き直しました。私はこのクラスで100%単体テストのカバレッジを持っていましたが、ほぼすべての関数をconstexprに変換した後、コンストラクタの一部がlcovにマークされました。constexprコンストラクタはカバレッジデータを表示しません

ここにはコンストラクタだけのクラスがあります。

template<typename T, std::size_t m, std::size_t n> 
class Matrix 
{ 
static_assert(std::is_arithmetic<T>::value, 
        "Matrix can only be declared with a type where " 
        "std::is_arithmetic is true."); 

public: 
    constexpr Matrix(
     std::initializer_list<std::initializer_list<T>> matrix_data) 
    { 
     if (matrix_data.size() != m) 
     { 
      throw std::invalid_argument("Invalid amount of rows."); 
     } 

     for (const auto& col : matrix_data) 
     { 
      if (col.size() != n) 
      { 
       throw std::invalid_argument("Invalid amount of columns."); 
      } 
     } 


     std::size_t pos_i = 0; 
     std::size_t pos_j = 0; 

     for (auto i = matrix_data.begin(); i != matrix_data.end(); ++i) 
     { 
      for (auto j = i->begin(); j != i->end(); ++j) 
      { 
       this->data[pos_i][pos_j] = *j; 
       ++pos_j; 
      } 
      ++pos_i; 
      pos_j = 0; 
     } 
    } 


private: 
    std::array<std::array<T, n>, m> data{}; 

}; 


int main() 
{ 
    Matrix<double, 2, 2> mat = { 
     {1, 2}, 
     {3, 4} 
    }; 

    return 0; 
} 

私は私がこのクラスに100%のユニットテストカバレッジを(持っていた)しているが、私はconstexprコンストラクタの一部に、ほぼすべての機能を変換した後、私は気づいたlcov 1.13

+0

ここでは何が求められましたか? –

+0

@ÖöTiib 'constexpr'コードが' gcov'を有効にしてカバレッジデータを生成しないのはなぜですか? – user0042

答えて

3

でのgcc 7.2を使用していますlcovには、もはやまったくカバーされていないとマークされています。 非カバーされたコード

lcovの表示がgcovは楽器それをしなかったことを意味します。

constexprをマークは、コンパイル時で評価され、gcovカバレッジ・データは、ランタイムに集まっています。

これは私が疑う理由の1つで、constexpr機能のカバレッジデータが得られない理由です。


あなたは、コードをテンプレート化しているように、私は私が最新のものだかはわからないが、私はgcovは非常によくない楽器テンプレートを行うことを経験し、そしてあなたが彼らのためにゼロカバレッジデータが残ることがあります。

constexprについて上記で述べたのと同様の理由から、テンプレートはコンパイル時に評価/インスタンス化されます。合理的な方法で、実際に使用されているテンプレートのインスタンス化をすべて計測することは、少なくとも難しいでしょう。

+0

"が評価される" - > "は、値テンプレート・パラメータを定義するために使用されない限り評価されます。この場合、コンパイル時に評価されます。 – rubenvb

+0

@rubenvbまあ、私が経験したところでは、 'gcov'はテンプレートコードをまったく作成してもうまく機能しませんでした。たぶんそれが主な理由です。 – user0042

関連する問題