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

Avoiding pointers in std::list

本文关键字:指针 list std      更新时间:2023-10-16

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

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吗?

"我可以期望编译器优化掉不必要的对象p吗?"

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

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

当你在合适的地方使用r值时,你通常有更好的优化机会。

但是即使没有优化,也没有理由使用指针,特别是对于这样小的对象(并不是说我提倡对大对象使用指针)。只有在语义上正确的情况下才使用指针,这种情况很少见。

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

期望副本被优化出来是不合理的。

可能是这样,但有点令人怀疑。

主要问题是函数的参数必须在调用函数之前被完全求值,所以对于一对int型的情况,它可能确实有效(它可以内联,因此编译器可能会看到没有异常/副作用),但通常来说,这是不合理的。

另一方面,考虑到动态内存分配的高成本,无论如何,在这种特殊情况下,副本绑定会更便宜!