【问题标题】:C++ fast equality functionC++ 快速相等函数
【发布时间】:2015-08-15 20:24:42
【问题描述】:

我想使用相等函数而不是运算符“==”来防止意外分配。我可以使用宏:

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

【问题讨论】:

  • 开启优化。
  • 您提供的代码显然不是您正在使用的代码。由于函数名称不同。复制和粘贴真实代码是个好主意。
  • 在一个微不足道和罕见的操作中,调试速度是否慢了 1.6 倍,这并不重要。在谈论分析时提供编译器标志和设置;您可能正在分析调试版本。
  • 一个体面(并且设置正确)的编译器应该警告您 if 子句中的意外分配,例如if(a = b)clang++g++
  • “我想使用相等函数来防止意外赋值。” 您的编译器已经内置了该功能。只需打开编译器警告即可。

标签: c++ templates macros equality


【解决方案1】:

使用== 真的不应该成为问题。通常人们重载运算符,以便他们可以在他们的对象上使用==,而不是相反。也喜欢人们建议打开编译器优化。

【讨论】:

    【解决方案2】:

    一些编码约定(适用于不警告 IF-s 中的赋值的旧编译器)
    建议将常量放在变量之前...
    例如:

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

    这样,如果您碰巧错过了第二个=,则会出现编译错误。

    但是,如上所述,您不必担心==
    只看编译警告。

    【讨论】:

    • 如果双方都是变量,这将没有任何优势。
    • @Thomas Matthews 正确,但仍适用于 90% 以上的情况。
    猜你喜欢
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多