类内初始化(赋值样式)与构造函数性能

时间:2017-04-23 18:03:11

标签: c++

要让类内init选择我想要的构造函数,似乎有必要使用类内init的赋值样式。

class Foo {
  // This lets me sets the vector size
  std::vector<char>  buf = std::vector<char>(BUF_SIZE);

  // this didn't compile and made me realize finding another way to provide constructor parameters was necessary
  // std::vector<char>  buf{BUF_SIZE};
};

这是否意味着要初始化&#34; buf&#34;在这种风格中,构造了两个对象,调用赋值运算符,销毁第二个对象?或者这只是语法糖,生成的代码最终与:

相同
class Bar {
public:
  Bar() : buf(BUF_SIZE) {}

  std::vector<char>  buf;
};

这可能是特定于编译器的吗?

1 个答案:

答案 0 :(得分:0)

一个好的编译器会忽略副本并构造一个向量。

禁用此优化后,会发生什么取决于您是否正在使用C ++ 11支持进行编译。我特别关注这一行,没有作为类成员的上下文(因为非静态成员初始化器是C ++ 11特性):

std::vector<char>  buf = std::vector<char>(BUF_SIZE);
  • 在C ++ 11之前,将构造一个向量(临时),然后buf将从此临时构造复制,然后临时被破坏。如果向量很大,这确实非常低效。
  • 从C ++ 11开始,构造临时,然后buf移动构造; buf将从临时“窃取”数据指针并将临时文件保留在未指定(但有效)的状态,然后临时被破坏。这个过程的开销微不足道。