【问题标题】:Avoiding pointers in std::list避免 std::list 中的指针
【发布时间】:2011-10-30 23:23:19
【问题描述】:

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

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

【问题讨论】:

  • 优化与否是否重要(成本将微不足道)。
  • 您正在将一个项目添加到列表中,这将导致堆分配,并且会在列表的每次迭代中导致大量缓存未命中 - 您担心复制两个整数?跨度>
  • 我担心在我的代码中处理指针,并导致内存泄漏。我要求在实施方面获得一些更有经验的意见,以确保我没有做任何特别愚蠢的事情。我感谢所有 cmets 和回复。

标签: c++ list std


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      期望副本被优化是不合理的。可能是,但有点怀疑。

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

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

      【讨论】:

        猜你喜欢
        • 2017-02-18
        • 2011-03-18
        • 1970-01-01
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多