非仮想メンバ関数の呼び出し

Example 46 に、仮想ベースまたは非仮想ベースのいずれかで非仮想関数を呼び出すことができるコードを示します。

Example 46. 非仮想関数の呼び出し

// rp は D* を格納する。rp->f() の等価の機能を実現する。ここで、f は
// 非仮想関数
// this ポインタ以外のすべての引数は既に設定済み
// f が struct を返さないと想定する
 if __mcall_is_in_vbase(D, f)
   LDR r12, [rp]                                   // vtable ポインタをフェッチする
   LDR r0, [r12, #-__mcall_offsetof_vbase(D, f)]   // vbase オフセットをフェッチする
   ADD r0, r0, rp                                  // this 調整を行う
 else
   ADD r0, rp, #__mcall_this_offset(D, f)          // this を設定および調整する
                                                   // D* のポインタ
 endif
   BL __cpp(&D::f)                                 // D::f を呼び出す

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0472EJ
Non-ConfidentialID081711