c++ - 这个 for 循环会在每次迭代时调用 set.size() 吗(set 是一个 vector )?

标签 c++ optimization

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/

相关文章:

c++ - 在 C++ 中,当 cin 是 bash heredoc 时调用 fork 会导致重复输入片段

c++ - 您将如何管理应该基于解决方案的 VS 中的环境变量?

assembly - 为什么 Clang 只从 Sandy Bridge 开始做这个优化技巧?

java - 在什么时候值得在Java中重用数组?

c++ - 如何允许通配符模板参数

c++ - 如何在没有范围的情况下使用枚举类

c++ - 在不发送任何内容的情况下获取函数的返回值

java - 什么是用于实时系统的良好日志记录库(快速且不创建对象)?

r - 用不平等来约束规范

c# - C# 或 JIT 编译器是否足够智能以处理此问题?