我无法弄清楚C ++中哪个更好:
我使用结构来管理消息队列中的客户端,结构如下所示:
typedef struct _MsgClient {
int handle;
int message_class;
void *callback;
void *private_data;
int priority;
} MsgClient;
所有这些都是POD实体。
现在,我有一些这些结构的数组,我存储了我的客户端(我使用数组作为内存约束,我必须限制碎片)。所以在我的班上我有这样的事情:
class Foo
{
private:
MsgClient _clients[32];
public:
Foo()
{
memset(_clients, 0x0, sizeof(_clients));
}
}
现在,我在这里和那里读到,使用memset在C ++中很糟糕,而且我宁愿在我的结构中使用构造函数。 我想到这样的事情:
typedef struct _MsgClient {
int handle;
int message_class;
void *callback;
void *private_data;
int priority;
// struct constructor
_MsgClient(): handle(0), message_class(0), callback(NULL), private_data(NULL), priority(0) {};
} MsgClient;
...将消除memset
的需要。但我担心的是,当初始化foo时,结构构造函数将被调用32次,而不是将其优化为数组占用的内存中的简单零。
您对此有何看法?
我刚刚发现:Can a member struct be zero-init from the constructor initializer list without calling memset?,在我的情况下是否合适(这是不同的:我有一个数组,而不是结构的单个实例)?
另外,根据this post,在我的结构中添加构造函数会自动将其转换为非POD结构,是不是?
答案 0 :(得分:12)
在符合实现的情况下,使用空成员初始化程序在构造函数初始化程序列表中值初始化数组是完全有效的。对于您的数组成员,这将具有零初始化每个数组元素的成员的效果。
编译器应该能够提高效率,并且您无需向struct
添加构造函数。
E.g。
Foo() : _clients() {}
答案 1 :(得分:3)
只要你明白自己在做什么,你就可以{C}自由地memset
。
关于性能 - 查看哪种方式更快的唯一方法是在发布配置中构建程序,然后在反汇编程序中查看生成的代码。
使用memset
声音比每个对象初始化快一些。但是编译器有可能生成相同的代码。