memset() 在构造函数中初始化对象?
memset() to initialize object in constructor?
我找到了一段使用 memset() 初始化对象的 C++ 代码:
struct Message
{
Message()
{
memset(this, 0, sizeof(Message));
}
unsigned int a, b, c;
};
既然是POD结构,这段代码应该没问题。
使用 memset 而不是构造函数有什么优势,例如:
Message() : a(0), b(0), c(0) {}
这样使用memset()
没有任何优势。抛开所有明显的缺点和未来的痛苦,有一个缺点使其效率低于
Message() : a(0), b(0), c(0) {}
这是因为POD
通常存储在数组中。如此优秀(智能)的编译器将有一个优势,即在
的情况下,用单个 memset()
替换数组中多个对象的初始化
Message * messages_1 = new Message[100];
或
std::vector<Message> messages_2;
messages_2.resize(100);
即使只构造单个对象,好的编译器也会在幕后使用 memset()
。
请注意,在 C++11 和更新版本中,您有比其中任何一个更好的选择:
struct Message
{
unsigned int a = 0;
unsigned int b = 0;
unsigned int c = 0;
};
这应该产生与带有初始化列表的构造函数方法相同的代码(和优化机会),同时:
- 使用更少的代码。
- 更具可读性。
- 添加成员时无需担心更新初始化列表。
- 免去考虑如果
b
以后需要默认为-1
怎么办。
我找到了一段使用 memset() 初始化对象的 C++ 代码:
struct Message
{
Message()
{
memset(this, 0, sizeof(Message));
}
unsigned int a, b, c;
};
既然是POD结构,这段代码应该没问题。
使用 memset 而不是构造函数有什么优势,例如:
Message() : a(0), b(0), c(0) {}
这样使用memset()
没有任何优势。抛开所有明显的缺点和未来的痛苦,有一个缺点使其效率低于
Message() : a(0), b(0), c(0) {}
这是因为POD
通常存储在数组中。如此优秀(智能)的编译器将有一个优势,即在
memset()
替换数组中多个对象的初始化
Message * messages_1 = new Message[100];
或
std::vector<Message> messages_2;
messages_2.resize(100);
即使只构造单个对象,好的编译器也会在幕后使用 memset()
。
请注意,在 C++11 和更新版本中,您有比其中任何一个更好的选择:
struct Message
{
unsigned int a = 0;
unsigned int b = 0;
unsigned int c = 0;
};
这应该产生与带有初始化列表的构造函数方法相同的代码(和优化机会),同时:
- 使用更少的代码。
- 更具可读性。
- 添加成员时无需担心更新初始化列表。
- 免去考虑如果
b
以后需要默认为-1
怎么办。