gpt4 book ai didi

c++ - 重构常规 C++ 代码模式

转载 作者:行者123 更新时间:2023-11-30 02:55:26 24 4
gpt4 key购买 nike

总结:我正在尝试看看是否可以重构一些具有规则模式的 C++ 代码,以使其更易于更新和维护。

详细信息:

我有一些代码可以创建线程本地计数器来跟踪程序执行期间的统计信息。当前,当将统计信息添加到源代码时,有 5 件事需要更新:计数器线程局部声明、计数器总声明、重置线程计数器的函数、将线程计数器添加到总数的函数,和打印功能。

代码如下:

// Adding a statistic named 'counter'

// Declaration of counter
__thread int counter = 0;
int total_counter = 0;

// In reset function
counter = 0;

// In add function
total_counter += counter;

// In print function
printf("counter value is: %d\n", total_counter);

我可以看到如何为计数器的声明创建一个宏,执行如下操作:

#define STAT(name) __thread int name; \
int total_##name;

但我还没有想到如何扩展它来更新 addreset 函数。理想情况下,我想输入类似 STAT(counter) 的内容,并处理所有用于管理统计信息的声明和函数。

编辑:

我已经有了用于更新代码中统计数据的宏。像 STAT_INC(counter) 这样的东西会增加本地计数器值。然后当线程完成执行时,它的线程局部值被添加到总计中。所以每个统计数据的名称都很重要,这就是为什么数组对我来说效果不佳的原因。因为真正的计数器名称是 cache_hit 之类的东西,它比 counter[2] 更有意义,而且我不想失去为统计数据使用任意名称的能力被创建。只是为了尽可能简化声明统计信息时必须编写的代码量。

最佳答案

这或多或少地保留了您在问题中描述的内容封装在模板类中:

enum StatNames {
STAT_rx_bytes,
STAT_tx_bytes,
//...,
};

template <StatNames SN>
class Stat {
static const char *name_;
static __thread int x_;
static int total_;

public:
Stat(const char *name) { name_ = name; }
static void reset () { x_ = 0; }
static void add () { total_ += x_; }
static void print () {
std::cout << name_ << " value is: " << total_ << "\n";
}
static int & x () { return x_; }
static int total () { return total_; }
};

template <StatNames SN> const char * Stat<SN>::name_;
template <StatNames SN> __thread int Stat<SN>::x_;
template <StatNames SN> int Stat<SN>::total_;

#define STAT(name) Stat<STAT_##name> name(#name)

然后您可以编写如下代码:

STAT(rx_bytes);

void * test (void *)
{
rx_bytes.x() += 4;
rx_bytes.add();
std::cout << pthread_self() << ": " << rx_bytes.x() << "\n";
return 0;
}

int main ()
{
pthread_t t[2];
pthread_create(&t[0], 0, test, 0);
pthread_create(&t[1], 0, test, 0);
pthread_join(t[0], 0);
pthread_join(t[1], 0);
rx_bytes.print();
}

关于c++ - 重构常规 C++ 代码模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16469037/

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