哪种方法更适合为函数提供编译时常量?函数参数与模板参数

时间:2011-12-19 06:51:18

标签: c++ templates comparison function-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);

我无法决定,因为第一种方法提供了简单性,但我们在编译时传递常量。第二种方法是完美的,但编译时间可能会增加。这个任务很繁琐,我还没有实现任何一个,所以我没有任何基准。

如果有人能够从他们的经验/知识中回答这个问题,那将是一个很大的帮助。

2 个答案:

答案 0 :(得分:4)

由于这两者之间的选择对调用代码有所影响,我建议通过宏进行日志记录。那么你现在不必担心哪些更好,因为它们之间很容易切换。

一旦你编写了真正的应用程序,就可以搞乱宏定义来比较两者。或者,如果有更多的生产区域需要优化。如果事实证明产生了很大的不同,您甚至可以将其保留在构建配置中,以决定是使用-DLOGGING_COMPILES_QUICKLY还是-DLOGGING_RUNS_QUICKLY

宏的另一个潜在好处:当且仅当debug为真时,您可以安排评估第一个参数。我不知道str的界面是什么,或者这些对象来自哪里,但是如果生成正确的值以传递给log,然后log没有任何成本在非调试的情况下使用它,那么这可能会浪费运行时间。

答案 1 :(得分:3)

我会选择第一个选项。传递两个整数对性能的影响可以忽略不计。优化器也可能内联函数调用,在这种情况下两者之间没有区别。我认为第二种选择是一个坏主意,因为你将无缘无故地创建相同功能的许多版本。