Gui*_*i13 8 c++ performance constructor struct initialization
我无法弄清楚C++中哪个更好:
我使用结构来管理消息队列中的客户端,结构如下所示:
typedef struct _MsgClient {
int handle;
int message_class;
void *callback;
void *private_data;
int priority;
} MsgClient;
Run Code Online (Sandbox Code Playgroud)
所有这些都是POD实体.
现在,我有一些这些结构的数组,我存储我的客户端(我使用数组作为内存约束,我必须限制碎片).所以在我的课上我有这样的事情:
class Foo
{
private:
MsgClient _clients[32];
public:
Foo()
{
memset(_clients, 0x0, sizeof(_clients));
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我在这里和那里读到,使用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;
Run Code Online (Sandbox Code Playgroud)
...将消除对的需要memset.但我担心的是,当初始化foo时,结构构造函数将被调用32次,而不是将其优化为数组占用的内存中的简单零.
你对此有何看法?
我刚刚发现:成员结构是否可以从构造函数初始化列表中归零,而无需调用memset?,在我的情况下是否合适(这是不同的:我有一个数组,而不是结构的单个实例)?
另外,根据这篇文章,在我的结构中添加构造函数会自动将其转换为非POD结构,是不是?
CB *_*ley 12
在一致的实现中,使用空成员初始化器对构造函数初始化列表中的数组进行值初始化是完全有效的.对于您的数组成员,这将具有零初始化每个数组元素的成员的效果.
编译器应该能够使这个非常有效,并且你不需要为你的构造函数添加构造函数struct.
例如
Foo() : _clients() {}
Run Code Online (Sandbox Code Playgroud)