Какой подход лучше использовать для предоставления констант времени компиляции для функции?Аргумент функции против параметра шаблона - PullRequest
6 голосов
/ 19 декабря 2011

У меня есть функция регистрации, вызываемая в нескольких местах кода.Для каждого журнала я должен указать 2 константы времени компиляции .Для этого есть 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);

Я не могу принять решение, потому что 1-й подход предлагает простоту, но мы передаем константу ввремя компиляции.Второй подход идеален, но время компиляции, вероятно, увеличится.Это утомительное занятие, и я еще не выполнил ни одного из них, поэтому у меня нет отметки.

Будет очень полезно, если кто-то ответит на это из своего опыта / знаний.

Ответы [ 2 ]

4 голосов
/ 19 декабря 2011

Поскольку выбор между этими двумя значениями влияет на вызывающий код, я бы порекомендовал войти в систему с помощью макроса.Тогда вам не нужно беспокоиться о том, какие из них лучше, потому что между ними легко переключаться.

После того, как вы написали свое реальное приложение, вы можете связываться с определением макроса, чтобы сравнить их.Или нет, если есть более продуктивные области для оптимизации.Если оказывается, что это имеет большое значение, вы можете даже оставить его открытым для конфигурации сборки, чтобы решить, использовать ли -DLOGGING_COMPILES_QUICKLY или -DLOGGING_RUNS_QUICKLY.

Еще одно потенциальное преимущество макроса: вы можете организовать этопервый аргумент оценивается тогда и только тогда, когда debug имеет значение true.Я не знаю, каков интерфейс str или откуда эти объекты, но если стоит что-то получить правильное значение для передачи log, а затем log не использует его вне отладочный случай, тогда это потенциальная трата времени выполнения.

3 голосов
/ 19 декабря 2011

Я бы пошел с первым вариантом.Влияние на производительность передачи двух целых чисел незначительно.Оптимизатор также, вероятно, встроит вызов функции, и в этом случае между ними не будет никакой разницы.Второй вариант, я думаю, является плохой идеей, поскольку вы будете создавать множество версий одной и той же функции без всякой причины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...