重复概念需求检查。我们应该关心他们吗?
Duplication of concept requirement checks. Should we care about them?
函数嵌套时,概念需求检查经常重复。
看下面的例子,
template<typename I>
requires std::forward_iterator<I>
auto fun1(I i){ ... };
template<typename I>
requires std::forward_iterator<I>
auto fun2(I i){
fun1(i);
....
}
fun1 在 fun2 内部被调用,因此 std::forward_iterator<I>
检查了两次。
我想知道这种重复的需求检查是否会对编译时间产生负面影响。
或者您认为我们应该努力减少需求检查的重复吗?
添加 :
我们可以采取一些措施来避免重复要求检查,如下所示,
template<typename I>
auto fun1_unchecked(I i) { ... }
template<typename I>
requires std::forward_iterator<I>
auto fun1(I i) {
return fun1_unchecked(i);
}
template<typename I>
requires std::forward_iterator<I>
auto fun2(I i) {
fun1_unchecked(i);
...
}
但我不知道这值得付出努力。
如果fun1
被fun2
以外的人调用,那么概念的存在不是重复。仅调用 fun1
的代码也需要一个概念化的接口。它们是两个独立的函数;其中一个恰好打电话给另一个。
如果 fun1
仅由 fun2
调用,则可以删除该概念。但除此之外,它是您系统中有意义的一部分,应该有一个合适的界面。
至于“重复”的 compile-time 成本,该标准为 C++ 实现提供了将成本降至最低所需的所有回旋余地。对于任何给定的类型 T
,如果(一个文件的)编译器看到 concept_name<T>
,编译器可以自由地假设 concept_name<T>
的每个后续使用都会产生相同的值。所以它可以有效地缓存它。
所以“重复”的任何成本都应该最小化。
Do you think we should endeavor to reduce duplication of requirement checks?
没有。除非您有来自实际编译器的 实际 性能指标告诉您存在实际性能问题。
函数嵌套时,概念需求检查经常重复。
看下面的例子,
template<typename I>
requires std::forward_iterator<I>
auto fun1(I i){ ... };
template<typename I>
requires std::forward_iterator<I>
auto fun2(I i){
fun1(i);
....
}
fun1 在 fun2 内部被调用,因此 std::forward_iterator<I>
检查了两次。
我想知道这种重复的需求检查是否会对编译时间产生负面影响。
或者您认为我们应该努力减少需求检查的重复吗?
添加 :
我们可以采取一些措施来避免重复要求检查,如下所示,
template<typename I>
auto fun1_unchecked(I i) { ... }
template<typename I>
requires std::forward_iterator<I>
auto fun1(I i) {
return fun1_unchecked(i);
}
template<typename I>
requires std::forward_iterator<I>
auto fun2(I i) {
fun1_unchecked(i);
...
}
但我不知道这值得付出努力。
如果fun1
被fun2
以外的人调用,那么概念的存在不是重复。仅调用 fun1
的代码也需要一个概念化的接口。它们是两个独立的函数;其中一个恰好打电话给另一个。
如果 fun1
仅由 fun2
调用,则可以删除该概念。但除此之外,它是您系统中有意义的一部分,应该有一个合适的界面。
至于“重复”的 compile-time 成本,该标准为 C++ 实现提供了将成本降至最低所需的所有回旋余地。对于任何给定的类型 T
,如果(一个文件的)编译器看到 concept_name<T>
,编译器可以自由地假设 concept_name<T>
的每个后续使用都会产生相同的值。所以它可以有效地缓存它。
所以“重复”的任何成本都应该最小化。
Do you think we should endeavor to reduce duplication of requirement checks?
没有。除非您有来自实际编译器的 实际 性能指标告诉您存在实际性能问题。