《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)
[] [] []
From:http://tw.wingwit.com/Article/os/xtgl/201311/10162.html