要让类内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;
};
这可能是特定于编译器的吗?
答案 0 :(得分:0)
一个好的编译器会忽略副本并构造一个向量。
禁用此优化后,会发生什么取决于您是否正在使用C ++ 11支持进行编译。我特别关注这一行,没有作为类成员的上下文(因为非静态成员初始化器是C ++ 11特性):
std::vector<char> buf = std::vector<char>(BUF_SIZE);
buf
将从此临时构造复制,然后临时被破坏。如果向量很大,这确实非常低效。buf
将移动构造; buf
将从临时“窃取”数据指针并将临时文件保留在未指定(但有效)的状态,然后临时被破坏。这个过程的开销微不足道。