A question类似这个已经被问过,它没有确定的可接受的答案。
这个 for 循环是否会在每次迭代时调用 set.size()(set 是一个 vector )?
for(int i = 0; i < set.size(); i++)
下面的代码会更快吗?
int size = set.size();
for(int i = 0; i < size; i++)
VS 2010 编译器是否足够智能,不会让程序在每次迭代时都调用 .size()?
最佳答案
一般来说,现代优化编译器可以进行非常强大的优化。自己做这样的优化是非常不值得的,通常你只会妨碍编译器。在查看优化代码之前,您应该分析代码以确定性能问题是什么。
使用 godbolt (see live code) 进行快速测试使用此代码:
void function() {
std::set<int> set ;
set.insert( 10 ) ;
set.insert( 20 ) ;
for(int i = 0; i < set.size(); i++)
{
printf( "%d\n", i ) ;
}
}
说明是直接访问count变量,并没有进行函数调用,相关程序集为:
movq $0, 56(%rsp) #, MEM[(struct _Rb_tree_impl *)&set]._M_node_count
和:
cmpq %rbx, 56(%rsp) # ivtmp.115, MEM[(long unsigned int *)&set + 40B]
因此,至少在这种简单的情况下,gcc
优化器似乎能够完成您想自己完成的快速技巧。尽管生成的代码不同,clang
似乎也在做类似的事情。
更新
问题已更新为提及 Visual Studio。
我不知道有什么在线工具可以生成 Visual Studio 程序集,否则我也会检查一下,但如果 Visual Studio 也执行类似的优化,我也不会感到惊讶。正如我们所见,优化绝对是可能的。一旦生成 assembly in Visual Studio重要的是确定是否在循环的每次迭代中调用 size()
。
关于c++ - 这个 for 循环会在每次迭代时调用 set.size() 吗(set 是一个 vector )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26395613/