我很困惑,因为我的反汇编代码与我的知识不同。据我所知,第一个参数由RCX传递,返回值存储在RAX中。但是在代码下面使用RCX作为返回值容器并通过RDX传递第一个参数。为什么会发生这种情况?这种方式的名称是什么?
这是我编译的cpp代码:
#include "stdafx.h"
#include <memory>
#include <map>
#include <iostream>
using namespace std;
class Zelon {
public:
int64_t kkk;
int64_t lll;
};
typedef shared_ptr<Zelon> ZelonPtr;
std::map<std::string, ZelonPtr> aMap;
shared_ptr<Zelon> Find(const std::string& f) {
auto it = aMap.find(f);
return it == aMap.end() ? nullptr : it->second;
}
int _tmain(int argc, _TCHAR* argv[]) {
std::string k = "zelon";
ZelonPtr result = Find(k);
if (result->kkk == 100) {
cout << "100" << endl;
}
return 0;
}
这是反汇编的代码:
ZelonPtr result = Find(k);
00007FF6FAC014DE lea rdx,[k]
00007FF6FAC014E3 lea rcx,[result]
00007FF6FAC014E8 call Find (07FF6FAC012B0h)
00007FF6FAC014ED nop
if (result->kkk == 100) {
00007FF6FAC014EE mov rax,qword ptr [result]
00007FF6FAC014F3 cmp qword ptr [rax],64h
此代码在Visual Studio 2013 x64版本完全优化中编译。
答案 0 :(得分:-1)
我从http://msdn.microsoft.com/en-us/library/ms364057(VS.80).aspx
得到了答案这是一种“返回值优化”的方法,使用隐藏参数。