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

问题描述 投票:0回答:2

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

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

   unsigned int a, b, c;
};

由于这是一个POD结构,所以这段代码应该没问题。
使用 memset 而不是构造函数有什么优势,例如:

Message() : a(0), b(0), c(0) {}
c++ constructor initialization memset
2个回答
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()


3
投票

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

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

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

  • 使用更少的代码。
  • 更具可读性。
  • 添加成员时无需担心更新初始化列表。
  • 无需考虑如果
    b
    稍后需要默认为
    -1
    该怎么办。
© www.soinside.com 2019 - 2024. All rights reserved.