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

时间:2015-03-02 11:03:12

标签: c++ constructor initialization memset

我发现这段C ++代码使用memset()来初始化一个对象:

struct Message
{
   Message()
   {
      memset(this, 0, sizeof(Message));
   }

   unsigned int a, b, c;
};

由于这是POD结构,因此该代码应该没问题 使用memset而不是构造函数是否有任何优势,例如:

Message() : a(0), b(0), c(0) {}

2 个答案:

答案 0 :(得分:5)

使用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(),幕后。

答案 1 :(得分:2)

请注意,在C ++ 11及更新版本中,您有比其中任何一个更好的选项:

struct Message
{
   unsigned int a = 0;
   unsigned int b = 0;
   unsigned int c = 0;
};

这应该为构造函数与初始化列表方法产生相同的代码(和优化机会),同时:

  • 使用更少的代码。
  • 更具可读性。
  • 无需担心在添加成员时更新初始化列表。
  • 如果b稍后需要默认为-1,则无需考虑该怎么做。