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

Pie*_*tro 4 c++ constructor initialization memset

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

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

   unsigned int a, b, c;
};
Run Code Online (Sandbox Code Playgroud)

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

Message() : a(0), b(0), c(0) {}
Run Code Online (Sandbox Code Playgroud)

Gre*_*ape 5

使用memset()这样没有优势.抛开所有明显的缺点和未来的痛苦,有一个缺点,使其效率低于

Message() : a(0), b(0), c(0) {}
Run Code Online (Sandbox Code Playgroud)

这是因为PODs通常存储在数组中.那么好(智能)编译器将有优势取代多个对象的初始化与一个单一的阵列memset(),在的情况下,

Message * messages_1 = new Message[100];
Run Code Online (Sandbox Code Playgroud)

要么

std::vector<Message> messages_2;
messages_2.resize(100);
Run Code Online (Sandbox Code Playgroud)

即使只构建单个对象,优秀的编译器也会memset()在幕后使用.


Par*_*tes 5

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

struct Message
{
   unsigned int a = 0;
   unsigned int b = 0;
   unsigned int c = 0;
};
Run Code Online (Sandbox Code Playgroud)

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

  • 使用更少的代码。
  • 更具可读性。
  • 添加成员时无需担心更新初始化列表。
  • 无需考虑b默认情况下该怎么办-1