知道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));
谢谢!
答案 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
是否具有虚拟成员函数?