我在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));
}
}
现在我在 Stack Overflow 上读到,使用 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;
如果使用结构体的构造函数来初始化foo,就可以不需要使用memset
了。但我的担忧是,当foo被初始化时,结构体构造函数将被调用32次,而不是优化为简单地清零由数组占用的内存。
您对此有何看法?
我刚刚发现了这篇文章:Can a member struct be zero-init from the constructor initializer list without calling memset? ,它适用于我的情况吗(我的情况不同:我有一个数组,而不是结构体的单个实例)?
此外,根据这篇文章的说法,向我的结构体添加构造函数将自动将其转换为非POD结构体,这是正确的吗?
memset
会有效地破坏它。 - Nicol Bolas