【发布时间】: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 倍,这并不重要。在谈论分析时提供编译器标志和设置;您可能正在分析调试版本。
-
“我想使用相等函数来防止意外赋值。” 您的编译器已经内置了该功能。只需打开编译器警告即可。
标签: c++ templates macros equality