Visual Studio 2013 x64调用约定优化以返回shared_ptr

时间:2014-10-15 15:10:05

标签: visual-studio-2013 64-bit calling-convention disassembly

我很困惑,因为我的反汇编代码与我的知识不同。据我所知,第一个参数由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版本完全优化中编译。

1 个答案:

答案 0 :(得分:-1)

我从http://msdn.microsoft.com/en-us/library/ms364057(VS.80).aspx

得到了答案

这是一种“返回值优化”的方法,使用隐藏参数。