多向量访问与本地对象

时间:2014-02-03 16:56:43

标签: c++ cocos2d-x stdvector

知道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));

谢谢!

4 个答案:

答案 0 :(得分:3)

在确定代码的这一部分确实会降低应用程序速度之前,请不要进行优化。具有局部变量的示例更易于理解,因此始终在第一个实现中使用它。无论如何,编译器可能会在发布模式下为两者生成相同的代码。

答案 1 :(得分:1)

不进行两次查找可能会有一些小的好处。请注意,您在第二个示例中调用at两次,但在第一个示例中只调用一次。

答案 2 :(得分:1)

使用现代编译器并不重要,如果启用优化,它将为两者生成相同的代码。要检查这一点,您可以打开编译器选项/ FA来生成汇编代码,如果相同,则意味着编译器将处理此问题。

答案 3 :(得分:1)

以下是我写这个的方法:

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是否具有虚拟成员函数?