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

以下の例では、仮想ベースまたは非仮想ベースのいずれかで非仮想関数を呼び出すコードを示します。

// 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 を呼び出す
関連する概念
7.26 コンパイラでの組み込みアセンブラのサポート
7.41 組み込みアセンブラの非スタティックメンバ関数の呼び出し
7.43 仮想メンバ関数の呼び出し
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.