私はClangのソースコードを読んでいて、ARM C ++ ABIについて何か面白いものを発見しましたが、その正当性を理解できないようです。ARM ABIドキュメントのオンラインバージョンから:
このABIでは、C1およびC2コンストラクターがこれを返す必要があります(void関数ではなく)。これにより、C3コンストラクターはC1コンストラクターを末尾呼び出しでき、C1コンストラクターはC2を末尾呼び出しできます。
(非仮想デストラクタについても同様です)
C1
ここで、、、C2
および参照が何であるかはわかりませんC3
...このセクションは、汎用(つまりItanium)ABIからの§3.1.5の変更を意味しますが、そのセクション(少なくともこのオンラインバージョンでは)は単に次のように述べています。
コンストラクターはvoidの結果を返します。
とにかく、私はこれの目的が何であるかを本当に理解できません:コンストラクターにこれを返すようにすると、どのように末尾呼び出しの最適化が可能になりますか?
私が知る限り、コンストラクターが同じthis
戻り値を持つ別のコンストラクターを末尾呼び出しできるのは、単一の基本クラス、単純なコンストラクター本体、重要なコンストラクターを持つメンバー、仮想のない派生クラスの場合のみです。テーブルポインタ。実際、returnを使用した末尾呼び出しを使用して最適化する方が、実際には簡単であるように思われます。これvoid
により、単一の基本クラスの制限を排除できるためです(複数の基本クラスの場合this
、最後に呼び出されたコンストラクターはthis
、派生オブジェクトのポインターにはなりません)。
ここで何が欠けていますか?this
リターンを必要とするARM呼び出し規約について何かありますか?