哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
Which approach is better for supplying compile time constants to a function ? Function argument vs. Template parameter
我在整个代码的几个地方调用了日志函数。对于每个日志,我必须提供2编译时间常数。有两种方法可以实现:
(1)参数:
template<typename T>
void log (const T &obj, const int LINE, const int COUNT)
{
// T is used for some purpose
if(debug)
logging(obj.out(), LINE, COUNT);
}
称它为,
log(str, __LINE__, __COUNTER__);
(2)模板参数:
template<typename T, int LINE, int COUNT>
void log (T &obj)
{
// T is used for some purpose
if(debug)
logging(obj.out(), LINE, COUNT);
}
称它为,
log<__LINE__, __COUNTER__>(str);
我不能决定,因为第一种方法提供了简单性,但是我们在编译时传递常量。第二种方法是完美的,但是编译时间可能会增加。这个任务很乏味,而且我还没有实现它们中的任何一个,所以我没有任何基准。
如果有人能从他们的经验/知识中回答这个问题,那将是很大的帮助。
由于这两者之间的选择会对调用代码产生影响,因此我建议通过宏进行日志记录。那么你现在就不必担心哪一个更好,因为很容易在它们之间切换。
一旦编写了实际的应用程序,就可以使用宏定义来比较两者。如果有更多富有成效的领域需要优化,也可以不去做。如果结果证明有很大的不同,你甚至可以把它留给构建配置来决定是使用-DLOGGING_COMPILES_QUICKLY
还是-DLOGGING_RUNS_QUICKLY
。
宏的另一个潜在好处:您可以安排当且仅当debug
为真时计算第一个参数。我不知道str
的接口是什么,或者这些对象来自哪里,但如果它花费任何东西来产生正确的值传递给log
,然后log
不使用它在非调试情况下,那么这是一个潜在的浪费运行时间。
我会选择第一个选项。传递两个整数对性能的影响可以忽略不计。优化器也可能内联函数调用,在这种情况下,两者之间没有区别。我认为第二个选择是一个坏主意,因为您将无缘无故地为同一个函数创建许多版本。
相关文章:
- rcpp函数中的清理时间很长
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 函数的时间复杂度是多少?
- 在多个时间戳处执行函数
- 如何计算此排序函数的时间复杂度?
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 将 hh:mm:ss.zzz 时间 QString 转换为毫秒的单行函数?
- 如何计算函数的时间复杂度?
- 构造函数的链接时间自动注册
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- C++不重载时间函数,所以我们不需要写 NULL 有什么原因吗?
- 在确定函数的时间复杂度时需要帮助
- 结构成员的地址作为编译时间常数之间的差异
- 编译时间评估函数以计算常数
- 用于检查编译时间常数的静态断言未传递给宏
- 静态函数返回常数浮点
- 加泰罗尼亚数字,递归函数时间复杂度
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 我如何在常数时间(O(1))内获得字母表(1-26)中字符的数值/位置,而不使用任何内置方法或函数
- 什么占用了我的函数时间