假设我有一些代码调用一个像vector :: length()这样的方法几次......创建一个临时变量,如
int length=myVector.length()
使它比调用该方法几次更有效吗?
这是一个有点假设的问题,所以让我们假设调用vector :: length()是获得我们想要的结果的唯一方法。
答案 0 :(得分:5)
将值存储在局部变量中的成本几乎为零。调用内联“获取此成员变量”的成本也几乎为零。
另一方面,如果对象不是向量,并且length
不是在成员变量中保留,而是必须计算 - 比如strlen()
,那么有一个很好的将其存储在局部变量中的好处。特别是如果字符串长度超过几个字符。
另一个问题当然是你做了类似的事情:
int number_of_widgets = my_widgets.length();
... // more code here, but none that affect my_widgets.
last_widget = my_widgets[number_of_widgets-1];
...
然后其他人去编辑cdoe:
int number_of_widgets = my_widgets.length();
... some code.
my_widgets.erase(some_widget_iterator);
... // more code here
last_widget = my_widgets[number_of_widgets-1];
...
现在您的代码正在有效范围之外访问,可能会崩溃并烧毁......
与往常一样,魔鬼在细节中。如果你想知道你的代码中最快的是什么,那么使用你的代码对它进行基准测试......
答案 1 :(得分:2)
在这种情况下,您无需担心速度,直接调用length()会很快。为了便于阅读,除非你真的多次调用它,否则我会说 - 直接调用它。如果它确实使代码变得很糟糕,例如在10行上调用了10次,那么你可以将它缓存在变量中以使代码看起来更好。
优化规则1:不优化。反正它很快。我不认为vector :: length()会降低你的程序速度,但无论如何,只要你没有速度问题,没有充分的理由尝试手动优化它。如果相关,智能编译器应该决定并优化它。
在IDE上你有代码完成所以它甚至不是输入更多的问题,只是代码的视觉可读性(再次,除非这个特定的功能正在减慢程序,我怀疑)。
答案 2 :(得分:1)
唯一能说明问题的方法是分析您的代码。
就个人而言,如果我知道该向量在当前范围内不会改变,我会最初优化可读性,并根据profiling 进行任何调整(如果需要):
const int number_of_widgets = myVector.size();
“我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源” --Donald Knuth
答案 3 :(得分:0)
真正的答案是你应该使用迭代器,因为它们通常更快,并且它们完全避免了这个问题(假设向量没有重新分配)。
您可能正在寻找的答案是:它通常在简单的情况下进行优化,但并非总是如此。
答案 4 :(得分:0)
我认为它们都会编译成相同的代码。但假设不好,所以我尝试了一个测试程序。 我先编译:
#include <iostream>
#include <vector>
int main()
{
int myints[] = {16,2,77,29};
std::vector<int> myVector (myints, myints + sizeof(myints) / sizeof(int) );
int length=myVector.size();
std::cout << length << std::endl;
std::cout << length*3 << std::endl;
return 0;
}
这正确地给出了4和12的输出。然后我尝试了这个程序,我不使用变量“length”。
#include <iostream>
#include <vector>
int main()
{
int myints[] = {16,2,77,29};
std::vector<int> myVector (myints, myints + sizeof(myints) / sizeof(int) );
std::cout << myVector.size() << std::endl;
std::cout << myVector.size()*3 << std::endl;
return 0;
}
这个程序也正确地给出了4和12的输出,并做了完全相同的事情,但两者之间没有可变长度。 我可以说使用编译标志-O3或-O2它们给出完全相同的二进制代码。这是通过gcc编译器完成的。因此,两种方式都不会更快,并且它们都使用相同数量的内存。
因此,只需使用最好看,最容易阅读。
虽然我不确定我们是否可以从我的测试中完全概括,因为其他优化可能会起作用。例如,有可能myVector.size()在编译时计算为4,因此可能已经硬编码到文件中而不是在运行时计算出来。这将使我的测试毫无意义。
希望这会有所帮助。 (虽然我在写这篇文章时可以看到其他4个答案),所以其他人可能已经做了更好的测试。