【发布时间】:2012-11-16 06:50:43
【问题描述】:
环境:Linux,g++-4.7
我使用 std::vector 和我自己的一个类来测试这个。而且我发现在使用std::initializer_list构造向量的时候,其实是调用了自定义类的拷贝构造函数来制作临时对象。因此,我认为它确实效率低下,我使用“const std::initializer_list & li”来替换它。
为什么它在 STL 库中很常见?例如:
// This is in STL: stl_vector.h
vector(initializer_list<value_type> __l, const allocator_type & __a = allocator_type())
//...
真的有什么让我想不开的吗?
我的测试代码如下所示:
#include <iostream>
#include <vector>
#include <initializer_list>
class Test
{
public:
Test(const Test & t) : v(t.v) {
std::cout << "Copy Cons" << std::endl;
}
Test(Test && t) : v(std::move(t.v)) {
std::cout << "MC" << std::endl;
}
Test(int val) : v(val) {}
private:
int v;
};
int main()
{
std::vector<Test> vv({Test(0), Test(1), Test(2)});
return 0;
}//main
它的输出:
Copy Cons
Copy Cons
Copy Cons
【问题讨论】:
-
initializer_list<value_type>是一对指针。复制它非常便宜,并且不涉及您自己类型的任何副本。这里的问题具有不同的性质。 stackoverflow.com/questions/8193102/… -
请看我的测试文件和输出,你可能会发现它真的在做复制构造。
-
请查看我链接的问题,您可能会发现其原因与通过值传递
initializer_list无关。