多次使用时,将向量大小存储到 int 变量中是否更有效
Is it more efficient to store vector size into an int variable when using it multiple times?
所以如果我们有下面的代码:
vector<string> vec1;
//initialize vec1 to contain thousands of strings
for (int i = 0; i < vec1.size(); i++) {
//.....
}
for (int j = 0; j < vec1.size(); j++){
//......
}
声明一个 int vec_size = vec1.size() 并像这样使用它会更快吗:
int vec_size = vec1.size();
for (int i = 0; i < vec_size; i++) {
//.....
}
for (int j = 0; j < vec_size; i++) {
//.....
}
如果是这样,为什么?
取决于编译器优化设置。 在某些优化设置中,编译器可能会意识到字符串没有更改,因此只调用函数一次。
在 for
循环中,每次迭代都会调用表达式 j < vec1.size()
。 如果向量大小在循环中没有变化,那就是一堆浪费的函数调用。 调用它一次并分配给变量将执行减少为一次调用 std::vector::size()
。
顺便说一下,size()
方法返回size_t
,这通常与unsigned int
兼容。(向量不能具有负大小)。
所以你的循环应该是:
const size_t vec_size = vec1.size();
for (unsigned int i = 0; i < vec_size; ++i)
{
//...
}
将向量大小变量声明为常量允许编译器执行更多优化;你告诉编译器变量不会改变其值。
有时。如果编译器优化处于关闭状态(例如,对于调试版本),则方法调用甚至可能没有内联,并且可能会有所作为。
不过,C++编译器非常擅长优化 - 通常编译器将首先内联方法调用,并且根据循环的内容,它将看到向量在其中没有变化并为值分配寄存器,而不是每次从对象读取它(同样,取决于循环体 - 在复杂的循环中, 将寄存器专用于此是没有意义的,因为它会为所有其他工作留下一个寄存器,因此不会完成)。这归结为与您自己吊起它完全相同的事情。
在实践中 - 不要手动提升它。它损害了代码的可读性,并且不会提高速度,除非优化关闭,在这种情况下,无论如何都会有更大的效率低下。
相关文章:
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 在c++中获取两个大int,并将它们存储在数组中
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如果 x < 10,则添加前导 0 并将其存储为 int
- 如何读取 TXT 文件并仅将 int 存储在 C 中
- 如何在函数中将字符串和分数存储为(Int 或 float)
- 如何声明一个必须在C++中同时存储int和char值的2D数组
- 如果char可以在C++中存储数字,为什么我们需要int
- 如果我在 C++ 中为 int 提供双精度,输入缓冲区中存储了什么?
- 我应该使用无符号字符而不是 int 来存储永远不会大于 255 的值吗?
- 我正在编写一个代码来将 int 数组存储在文件中,然后用 c++ 检索它,但是检索第一项是假值,我该如何解决这个问题?
- unordered_set是否适合存储矢量<int>元素的数据结构?如果是这样,我将如何实现哈希函数?
- 什么是在C 中存储结果INT*的最佳数据类型
- char*中存储的返回int值(0-255)给出了负值
- 将字符指针按顺序存储在 map 中 std::map<char*, int> mymap。将其存储为字符或字符串不是一个选项
- 如何在文件中节省空间地存储和检索 std::vector<int> 值
- 如何将char和int存储在同一个变量中
- c++int存储为char*转换中的字符,无需任何API
- Vector将int存储为ascii码
- c++11将数据从一个int*存储到另一个int