c++快速相等函数
C++ fast equality function
我想用相等函数代替运算符"=="来防止意外赋值。我可以使用宏:
#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'); }
这样,如果你碰巧错过了第二个=
,你会得到编译错误。
但是,如前所述,你不应该担心==
,
只看编译警告。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗