如何确保以下大型结构体中的整数始终初始化为0,哪种方法最好?
struct Statistics {
int num_queries;
int num_respones;
// ... 97 more counters here
int num_queries_filtered;
}
我希望避免每次检查这个结构体被初始化时都需要确认它是用
Statistics s();
进行值初始化而不是默认初始化的Statistics s;
。Statistics s; // Default initialized by accident here
s.num_queries++; // Oh no, this is a bug because it wasn't initialized to zero
Statistics s2{}; // Correctly value initialized
s2.num_queries++; // Successful
建议1 - 使用memset
,但这感觉像是一种技巧,我们利用值初始化恰好等同于零填充数据结构:
struct Statistics {
Statistics() { memset(this, 0, sizeof(*this)); }
// ... counters here
}
建议2 - 使用构造函数初始化列表,但这是繁琐的,当人们在未来添加新计数器时,可能会忘记在构造函数中进行零初始化:
struct Statistics {
Statistics() : num_queries(0), num_respones(0), /* ... */, num_queries_filtered(0) {}
// ... counters here
}
方案三 - 强制进行值初始化,步骤如下:
struct StatisticsUnsafe {
// ... counters here
}
struct Statistics : public StatisticsUnsafe {
Statistics() : StatisticsUnsafe() {}
}
你认为最好的方法是什么?你有其他替代方案吗?
编辑:我想澄清一下,在我的实际代码中,每个计数器都有一个有意义的名称,例如“num_queries_received”、“num_responses”等。这就是为什么我不选择使用形如“counters[100]”的向量或数组的原因。
编辑2:将例子从
Statistics s2();
更改为Statistics s2{};
。
counterX
最好作为一个数组。你可以使用int counter[100]{}
来对元素进行值初始化。 - David GStatistics s2();
不会默认初始化Statistics
,它声明了一个返回Statistics
的函数。你可能想要使用Statistics s2{};
或者auto s2=Statistics();
。 - Mooing DuckStatistics s{};
可以解决问题,但是被踩了👎。 - vsoftco