6

我在整个代码的几个地方都调用了日志记录函数。对于每个日志,我必须提供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);

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

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

4

2 回答 2

4

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

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

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

于 2011-12-19T10:32:57.337 回答
3

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

于 2011-12-19T07:00:04.897 回答