2017-12-14 16 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; 
} 

나는 lcov와 GCC 7.2을 사용하고 1.13

+0

여기에서 묻는 질문은 무엇입니까? –

+0

@ ÖöTiib'constexpr' 코드가'gcov'가 활성화 된 상태에서 어떤 커버리지 데이터도 생성하지 않는 이유는 무엇입니까? – user0042

답변

3

내가 constexpr에 생성자의 일부를 거의 모든 기능을 변환 한 후 I (했다) 한이 클래스에 100 % 단위 테스트 커버리지하지만 발견 더 이상 적용되지 않는 lcov에 표시됩니다. 비 적용 코드

lcov의 표시가 gcov이 악기를하지 않았다는 것을 의미한다.

constexpr 아무것도 표시가 컴파일 시간에서 평가된다 gcov 따르면 데이터 런타임에 모여있다.

이것이 제가 의심하는 이유 중 하나입니다. constexpr 기능에 대한 적용 범위 데이터를 얻지 못하는 이유는 무엇입니까? 당신이 코드를 템플릿 것처럼


, 나는 최신 해요 잘 모르겠어요,하지만 난 gcov 잘되지 악기 템플릿을한다는 것을 경험하고 그들을 위해 제로 범위 데이터로 남아있을 수 있습니다 .

위에서 말한 constexpr의 경우와 비슷한 이유로, 템플릿은 컴파일 타임에 평가되거나 인스턴스화됩니다. 실제로 사용되는 모든 템플릿 인스턴스화를 합리적인 방법으로 계측하는 것은 적어도 어렵습니다.

+0

"은"-> "값 템플릿 매개 변수를 정의하는 데 사용되지 않는 한 평가 될 수 있습니다.이 경우 매개 변수는 컴파일시 평가됩니다." – rubenvb

+0

@rubenvb 글쎄,'gcov'는 템플릿 코드를 전혀 작성하지 않았기 때문에 잘 작동하지 않았습니다. 어쩌면 그것이 주된 이유 일 것입니다. – user0042