我有两个这样的性能关键函数:
insertExpensive(Holder* holder, Element* element, int index){
//............ do some complex thing 1
holder->ensureRange(index);//a little expensive
//............ do some complex thing 2
}
insertCheap(Holder* holder, Element* element, int index){
//............ do some complex thing 1
//............ do some complex thing 2
}
如何将 2 个函数组合在一起以提高可维护性?
我糟糕的解决方案:
解决方案 1.
insertExpensive(Holder* holder, Element* element, int index){
do1();
holder->ensureRange(index);//a little expensive
do2();
}
insertCheap(Holder* holder, Element* element, int index){
do1();
do2();
}
那会很丑。
如果 do2
想要来自 do1
的一些局部变量,这也是不切实际的。
解决方案 2.
insert(Holder* holder, Element* element, int index, bool check){
//............ do some complex thing 1
if(check)holder->ensureRange(index);//a little expensive
//............ do some complex thing 2
}
每次调用都需要进行条件检查。
解决方案 3.(草稿)
template<bool check> insert(Holder* holder, Element* element, int index){
//............ do some complex thing 1 (Edit2 from do1());
bar<check>();
//............ do some complex thing 2 (Edit2 from do2());
}
template <>
inline void base_template<true>::bar() { holder->ensureRange(index); }
template <>
inline void base_template<false>::bar() { }
矫枉过正和不必要的复杂性?
编辑 1:
衡量方法好坏的标准优先级排序如下:-
1.最佳表现
2.减少重复代码
3. 代码总行少
4. 更易于专家和初学者阅读
编辑 2: 编辑第三个解决方案。感谢 mvidelgauz 和 Wolf。
最佳答案
您的解决方案 2 实际上还没有那么糟糕。如果此代码在 header 内,则它被隐式视为内联代码。 (我明确地写了它)如果你用 true 或 false 调用它,编译器可以删除 if 语句,尽管它是否会这样做取决于一系列因素。 (内联后的全身大小,常量的可见性,调优...)
inline void insert(Holder* holder,Element* element,int index, bool check){
do1();
if (check)
holder->ensureRange(index);//a little expensive
do2();
}
解决方案 3 实际上是您想要实现的,因为模板需要为每个不同的调用进行新的函数实例化,因此它会删除死代码。但是,它的编写方式与您编写解决方案 2 的方式非常相似。
template <bool check>
inline void insert(Holder* holder,Element* element,int index){
do1();
if (check)
holder->ensureRange(index);//a little expensive
do2();
}
如果你有 C++17,你不再需要依赖编译器来删除死代码,因为你可以强制它通过 constexpr-if 跳过某些代码。这种构造将保证 if 语句中的代码被删除,因为它甚至不必编译。
template <bool check>
inline void insert(Holder* holder,Element* element,int index){
do1();
if constexpr (check)
holder->ensureRange(index);//a little expensive
do2();
}
关于c++ - 将仅 1 行代码不同的两个函数分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38812275/