gpt4 book ai didi

c++ - 将可变参数函数参数转发到另一个可变参数函数而无需成本

转载 作者:太空狗 更新时间:2023-10-29 19:56:18 25 4
gpt4 key购买 nike

我有一个用于日志写入的可变函数 LogDebug。日志记录以两种模式发生。在大多数情况下,我的应用程序将可变参数转发给另一个可变参数 LogDebugEx,因此该路径需要优化。具体来说,对于我在 callgrind 图表上的一些请求,vsnprintf 需要 38%。请注意,此函数会针对单个请求调用多次。

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
}
}

问题:在转发到LogDebugEx 函数之前,我需要避免将整个参数列表复制到zDesc 数组。有没有一种方法可以将 LogDebug 的可变参数转发到 LogDebugEx 函数中?

在不更改对 LogDebug 的函数调用的情况下,任何其他奇特的方法也可以。我有 C++11 支持的编译器 GCC 4.9.3

最佳答案

如果我们有 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
}
}

关于c++ - 将可变参数函数参数转发到另一个可变参数函数而无需成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52159936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com