c++快速相等函数

C++ fast equality function

本文关键字:函数 c++      更新时间:2023-10-16

我想用相等函数代替运算符"=="来防止意外赋值。我可以使用宏:

#define is_equal_macro(X,Y) X == Y
// somewhere in code: 
if (is_equal_macro(a,b)) {...}

,但许多源代码调用通过使用内联和模板函数来避免宏。所以我写了下面的函数:

template<class T1, class T2> inline bool
    is_equal_template(T1 const & a, T2 const & b) {
        return a == b;
}
// somewhere in code: 
if (if_equal_template(a,b)) {...}

比宏慢1.6倍。我怎样才能在没有时间损失的模板风格写等式函数?

UPD:完整代码版本

#include <iostream>
#include <ctime>
#define is_equal_macro(X,Y) X == Y
template<class T1, class T2> inline bool
    is_equal_template(T1 const & a, T2 const & b) {
        return a == b;
}

int main(int argc, const char * argv[]) {
    size_t iter_num = 1e9;
    int a = 3;
    double b = 2.0;
    std::clock_t start;
    double duration;
    start = std::clock();
    for(size_t i = 0; i <= iter_num; ++i) {
        if (is_equal_macro(a, b)) {
        }
    }
    duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
    std::cout << duration << std::endl;
    start = std::clock();
    for(size_t i = 0; i <= iter_num; ++i) {
        if (is_equal_template(a, b)) {
        }
    }
    duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
    std::cout << duration << std::endl;
    return 0;
}

使用==真的不应该是一个问题。通常人们重载操作符是为了在对象上使用==,而不是相反。也像人们建议的那样打开编译器优化

一些编码约定(对于不警告IF-s中赋值的旧编译器)
建议将常量放在var之前…
例句:

int rc = DoSmthWithReturnErrorCode();
if(0 == rc) { puts('success'); }

这样,如果你碰巧错过了第二个=,你会得到编译错误。

但是,如前所述,你不应该担心==
只看编译警告。