c++ - 将仅 1 行代码不同的两个函数分组

标签 c++ performance function code-duplication maintainability

我有两个这样的性能关键函数:

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/

相关文章:

c - 函数未初始化

javascript - 在 jQuery 中使用动态生成的名称创建时态函数

c++ - 为什么它打印循环链表中的最后一个元素?

c++ - 如何使用C++和OpenCV生成热图?

html - 一个http请求可以调用多个css文件吗?

mysql - 加快缓慢的 MySQL 子查询更新

mysql - Symfony - 代币

c++ - QDataStream QIODevice 内存分配

c++ - C++ 中的函数可以返回一些东西然后执行它的代码吗?

performance - 泛化 monad 时,性能下降近 50%