避免使用std :: list中的指针

时间:2011-08-19 22:14:25

标签: c++ list std

我尽量避免使用指针,而不是做

std::list<std::pair<int,int>* > myList;
void addElement(int a, int b) {
    myList.push_back(new std::pair<int,int>(a,b));
}

我认为我可以做类似

的事情
std::list<std::pair<int,int> > myList;
void addElement(int a, int b) { 
    std::pair<int,int> p(a,b);
    myList.push_back(p);
}

如果我理解正确的行为,这应该存储该对的副本,并在执行myList.clear()时自动删除它(而不是指针)。

这是最好的方法吗? 我可以期望编译器优化掉不必要的对象p吗?

3 个答案:

答案 0 :(得分:8)

  

“我能指望编译器优化掉不必要的对象p吗?”

也许,也许不是。试试这个:

myList.push_back(std::make_pair(a,b));

在适用的情况下使用r值时,通常有更好的优化机会。

但即使它没有被优化掉,也没有理由使用指针,特别是对于这样的小对象(不是我主张使用指针来处理大对象)。只有在语义上使用指针时才使用指针,这种情况很少见。

答案 1 :(得分:5)

在C ++ 0x中,您可以使用std::list::emplace_back,它使用完美转发将参数传递给对象构造函数,从而在原位创建std::pair。但否则没有;它需要创建一个临时的。

答案 2 :(得分:1)

期望将副本优化出来是不合理的。它可能是,但它有点令人怀疑。

主要问题是在调用函数之前必须完全评估函数的参数,所以对于一对int的情况,它可能确实有效(它可以内联,因此编译器可能会看到它也不例外/侧面),它通常是不合理的。

另一方面,考虑到动态内存分配的高成本,无论如何,副本绑定会更便宜!