Передача аргументов переменной функции в другую переменную функцию без затрат - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть переменная функция LogDebug для записи журнала. Регистрация происходит в двух режимах. Мое приложение перенаправляет переменные аргументы в другую переменную функцию LogDebugEx в большинстве случаев, следовательно, этот путь необходимо оптимизировать. Точнее, для некоторых моих запросов на графе callgrind требуется * 383% для vsnprintf Обратите внимание, что эта функция вызывается много раз для одного запроса.

void LogDebug(const char* zFormat, ...)
{
    char zDesc[5000];
    va_list ap;
    va_start(ap, zFormat);
    vsnprintf(zDesc, 5000, zFormat, ap);  // Need to optimize in remode mode.
    va_end(ap);

    if (m_logMode == LOG_MODE_LOCAL)    // Does not need to optimize this mode.
    {
        // This mode is not interested.
    }
    else // m_logMode == LOG_MODE_REMOTE, critical path
    {
        LogDebugEx("%s", zDesc);   // Forwarded to new variadic function
    }
}

Вопрос : Мне нужно избегать копирования всего списка аргументов в массив zDesc перед пересылкой в ​​функцию LogDebugEx. Есть ли способ, с помощью которого я могу усовершенствовать переменные аргументов, поступающие на LogDebug в LogDebugEx функцию?

Любой другой причудливый способ сделать это также подойдет, не меняя вызовы функций на LogDebug. У меня C++11 поддерживается компилятор GCC 4.9.3.

1 Ответ

0 голосов
/ 04 сентября 2018

Если у нас есть c ++ 11, зачем возиться со списками переменных аргументов?

#include <utility>

extern enum {LOG_MODE_LOCAL, LOG_MODE_REMOTE} m_logMode;

extern void LogDebugEx(const char*, ...);

template<class...Args>
void LogDebug(const char* zFormat, Args&&...args)
{

    if (m_logMode == LOG_MODE_LOCAL)    // Does not need to optimize this mode.
    {
        char zDesc[5000];
        snprintf(zDesc, 5000, zFormat, args...);  
        // do what you have to do here
    }
    else // m_logMode == LOG_MODE_REMOTE, critical path
    {
        LogDebugEx(zFormat, std::forward<Args>(args)...);   // Forwarded to new variadic function
    }
}
...