避免在std::list中使用指针
Avoiding pointers in std::list
我尽量避免使用指针,而不是使用
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型的情况,它可能确实有效(它可以内联,因此编译器可能会看到没有异常/副作用),但通常来说,这是不合理的。
另一方面,考虑到动态内存分配的高成本,无论如何,在这种特殊情况下,副本绑定会更便宜!相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用std::multimap迭代器创建std::list
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 如何通过存储在 std::list 中的指针删除对象?
- CPP 对 std::list 中指针的引用
- C++ DLL 返回指向 std::list<std::wstring 的指针>
- 获取迭代器在基类型 "intrusive doubly linked list" 的指针字典中的位置
- 将数组传递给在 arg-list 中接受双指针的函数
- 使用 std::list 和对象指针
- (C++) list.error 方法和使用指针删除内存
- 在递归函数中创建 std::list of value 而不是 std::list of 指针
- 如何正确删除 std::list 中的指针
- List Traversal w/temp指针-在声明指针时分配指针引用的节点空间有危险
- 钩住std::list中的对象.指针或迭代器
- std::list指针上排序算法的STL谓词
- 在指向std::list的指针上使用delete
- 避免在std::list中使用指针
- <Value> 使用指向值的原始指针从 std::list 中删除?
- 对指向std::list类型的共享指针赋值不起作用
- std::list::排序和指向元素的指针