【发布时间】:2014-09-14 17:44:26
【问题描述】:
我很好奇在访问向量时哪种方法更快。
为了简单起见,假设我有两个对象:Player 和 Ship。
有一个玩家指针向量vector<Player*> players,每个玩家对象包含一个飞船指针向量vector<Ship*> ships,然后每艘飞船都有几个可以调用的函数,以此类推。
在这些情况下,直接访问这些功能是否更快?还是创建一个临时对象指针来访问所有内容?
这样做是否更快:
for (int i = 0; i < players.size(); i++)
{
for (int j = 0; j < players.at(i)->ships.size(); j++)
{
players.at(i)->ships.at(j)->update();
if (
(players.at(i)->ships.at(j)->get_x() > 0) &&
(players.at(i)->ships.at(j)->get_x() < screen_x) &&
(players.at(i)->ships.at(j)->get_y() > 0) &&
(players.at(i)->ships.at(j)->get_y() < screen_y)
)
{
players.at(i)->visible.push_back(j);
}
}
}
或者创建临时指针是否更快,以便不需要不断访问向量:
for (int i = 0; i < players.size(); i++)
{
Player* play = players.at(i);
for (int j = 0; j < play->ships.size(); j++)
{
Ship* ship = play->ships.at(j);
ship->update();
int ship_x = ship->get_x();
int ship_y = ship->get_y();
if (
(ship_x > 0) &&
(ship_x < screen_x) &&
(ship_y > 0) &&
(ship_y < screen_y)
)
{
play->visible.push_back(j);
}
}
}
我知道第二个视觉上更整洁,但真的不知道它是否一定更快。
想法?
【问题讨论】:
-
当你分析两者时发生了什么?
-
这取决于编译器是否能够保证您的代码不会修改向量。例如,如果
get_x修改了 player 或 ship 向量会发生什么?然后需要在第一个版本中再次查找向量。当然get_x,从它的名字来看,可能不会修改向量。但是编译器无法知道,除非函数代码在那个时候是可见的(例如内联函数) -
更快的是
operator[]而不是.at()。或者,使用现代 C++:for (Ship& ship : ships) for (Player& play : players) -
您真正应该做的一件事是将
players.at(i)替换为players[i]。at()会检查是否越界并且速度会相当慢。 -
@vsoftco 我不这么认为。这只是一个如果失败就会抛出的检查。考虑有一些语言对每个访问进行绑定检查。
标签: c++ performance pointers vector