C++ Tips: Adjustor thunk: what is it, why and how it works

來源:互聯網
上載者:User

轉載自:

http://blogs.msdn.com/b/oldnewthing/archive/2004/02/06/68695.aspx

 

If you find yourself debugging in disassembly, you'll sometimes find strange little functions called "adjustor thunks". Let's take another look at the object we laid out last time:

class CSample : public IPersist, public IServiceProvider
{
  public:
  // *** IUnknown ***
  STDMETHODIMP QueryInterface(REFIID riid, void** ppv);
  STDMETHODIMP_(ULONG) AddRef();
  STDMETHODIMP_(ULONG) Release();  // *** IPersist ***
  STDMETHODIMP GetClassID(CLSID* pClassID);  // *** IQueryService ***
STDMETHODIMP QueryService(REFGUID guidService,REFIID riid, void** ppv);
private:
 LONG m_cRef;
 ...
};
 
p    lpVtbl    QueryInterface (1)
q    lpVtbl    QueryInterface (2)   AddRef (1)
m_cRef AddRef (2) Release (1)
... Release (2) GetClassID (1)
QueryService (2)

In the diagram, p is the pointer returned when the IPersist interface is needed, and q is the pointer for the IQueryService interface.

Now, there is only one QueryInterface method, but there are two entries, one for each vtable. Remember that each function in a vtable receives the corresponding interface pointer as its "this" parameter. That's just fine for QueryInterface (1); its interface pointer is the same as the object's interface pointer. But that's bad news for QueryInterface (2), since its interface pointer is q, not p.

This is where the adjustor thunks come in.

The entry for QueryInterface (2) is a stub function that changes q to p, and then lets QueryInterface (1) do the rest of the work. This stub function is the adjustor thunk.

[thunk]:CSample::QueryInterface`adjustor{4}':  sub     DWORD PTR [esp+4], 4 ; this -= sizeof(lpVtbl)
                                                                    jmp CSample::QueryInterface

The adjustor thunk takes the "this" pointer and subtracts 4, converting q into p, then it jumps to the QueryInterface (1) function to do the real work.

Whenever you have multiple inheritance and a virtual function is implemented on multiple base classes, you will get an adjustor thunk for the second and subsequent base class methods in order to convert the "this" pointer into a common format.

 

簡言之,就是調整this指標,使其與實際執行的函數( QueryInterface(1) )保持一致,滿足當前所執行函數的要求。這是C++的實現方式細節,用來解決非虛多繼承時Vtbl layout的問題。參考:http://blogs.msdn.com/b/zhanli/archive/2010/07/01/c-tips-adjustor-thunk-what-is-it-why-and-how-it-works.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.