gpt4 book ai didi

c++ - constexpr 构造函数不会显示覆盖率数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:59:38 24 4
gpt4 key购买 nike

今天我将矩阵类重写为 constexpr。我对这个类有 100% 的单元测试覆盖率,但我注意到在我将几乎所有函数转换为 constexpr 之后,构造函数的一部分在 lcov 中被标记为根本不再被覆盖。

这是只有构造函数的类。

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

我正在使用 gcc 7.2 和 lcov 1.13

最佳答案

I have(had) 100% unit test coverage on this class but I noticed after I converted almost all functions to constexpr a part of the constructor is marked in the lcov as no longer covered at all.

lcov 指示未覆盖代码 意味着 gcov 没有检测它。

任何标记为 constexpr 的内容都在编译时 进行评估,gcov 覆盖数据在 时收集em>运行时

所以这就是我怀疑的原因之一,为什么您没有获得任何 constexpr 函数的覆盖率数据。


因为你有模板化代码,我不确定我是否是最新的,但我经历过 gcov 不能很好地检测模板,你可能会留下零覆盖率他们的数据。

与我上面针对 constexpr 所说的类似推理,模板在编译时被评估/实例化。至少很难以合理的方式检测所有实际使用的模板实例化。

关于c++ - constexpr 构造函数不会显示覆盖率数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47820014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com