memset()初始化构造函数中的对象

memset() to initialize object in constructor?

本文关键字:对象 构造函数 初始化 memset      更新时间:2023-10-16

我发现了这段使用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,则无需考虑该怎么办