多向量访问与本地对象



知道类CCPoint只有两个float成员变量,在第二个示例中使用第一个示例是否有任何性能好处?

std::vector<p2t::Point*> polyline;
for (int i = 0; i < points.size(); ++i) {
    CCPoint p = points.at(i);
    polyline.push_back(new p2t::Point(p.x, p.y));
}

换句话说,在这种情况下,这是使用本地实例的好习惯吗?

std::vector<p2t::Point*> polyline;
for (int i = 0; i < points.size(); ++i)
    polyline.push_back(new p2t::Point(points.at(i).x, points.at(i).y));

谢谢!

在确定代码的这一部分确实在减慢应用程序之前,切勿进行优化。具有局部变量的示例更适合理解,因此请始终将其用于首次实现。无论如何,编译器可能会在发行模式下为两者都生成相同的代码。

这是我写的:

std::vector<std::unique_ptr<p2t::Point>> polyline;
for (const CCPoint& p : points)
    polyline.push_back(std::unique_ptr<p2t::Point>(new p2t::Point(p.x, p.y)));

注意使用参考保存两次查找,但没有复制该点。unique_ptr可确保以后使用delete正确释放内存,您不再需要自己做。以及基于范围的创建更短的可读代码,还避免了at()内的冗余范围检查。

在C 14中,它变得更加有效:

std::vector<std::unique_ptr<p2t::Point>> polyline;
for (const CCPoint& p : points)
    polyline.emplace_back(std::make_unique<p2t::Point>(p.x, p.y));

请注意,从性能的角度来看,通过指针存储点不是理想的选择。当您想要多态收集时,通常是您通常要做的。p2t::Point是否具有虚拟成员函数?

可能会因不进行两次查找而可能会带来少量收益。请注意,您在第二个示例中两次致电at,但在第一个示例中仅一次。

在现代编译器的情况下,它并不重要,如果优化开始,它将为两者生成相同的代码。要检查这一点,您可以打开编译器选项/FA生成汇编代码,如果有相同的话,则意味着编译器将负责。

最新更新