gpt4 book ai didi

C++:使用 memset 还是结构构造函数?什么是最快的?

转载 作者:可可西里 更新时间:2023-11-01 18:17:57 26 4
gpt4 key购买 nike

我无法确定哪个在 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));
}

}

现在,我在这里和那里读到在 C++ 中使用 memset 是不好的,我宁愿为我的结构使用构造函数。我想到了这样的事情:

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 结构,对吗?

最佳答案

在符合规范的实现中,值初始化构造函数初始化列表中的数组使用空成员初始化是完全有效的。对于您的数组成员,这将对每个数组元素的成员零初始化产生影响。

编译器应该能够使其非常高效,您无需向 struct 添加构造函数。

例如

Foo() : _clients() {}

关于C++:使用 memset 还是结构构造函数?什么是最快的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6421818/

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