《Windows 用户态程序高效排错》市场价元 特价元 购买>> 代码中的std::transform和for loop的作用都是对整个vector调用func_template作转换可以比较transform和for loop的执行情况进行比较分析看看func_template的执行过程有什么区别在VS里面利用main函数设定断点停下来后用 ctrl+alt+D进入汇编模式单步跟蹤下面的分析证明了这是编译器的bug 在VisualStudio附带的STL源代码中发现 std::transform的实现中用这样的代码来调用传入的转换函数 *_Dest = _Func(*_First); 编译器对于该代码的处理是 EAX = FEA EBX = C ECX = BC EDX = ESI = EDI = B EIP = ESP = FE EBP = FEA EFL = : *_Dest = _Func(*_First); push esi call dword ptr [esp+h] D fstp dword ptr [edi] ESI寄存器中保存的是需要传入_Func的参数*_First可以看到std::transform把这个参数通过push指令传入stack给_Func调用 对于for loop中的*_Dest = func_templatefloatstd::string>(*_First);编译器是这样处理的 EAX = B EBX = ECX = BC EDX = ESI = EDI = C EIP = ESP = FE EBP = B EFL = : *_Dest = func_template<floatstd::string>(*_First); mov ebxesi call func_template <floatstd::basic_string<charstd::char_traits<char>std::allocator<char> > > (Ah) fstp dword ptr [ebp] 可以看到使用for loop的时候参数通过mov指令保存到ebx寄存器中传入func_template调用 最后看一下func_template函数是如何来获取传入的参数的 A push esi A push edi : std::cout<<u<<std::endl; A push ebx A push offset std::cout (h) [] [] [] |