インライン関数と虚関数(virtual)の議論

2023 ワード

インライン関数と虚関数(virtual)の議論
関数のinlineプロパティはコンパイル時に決定されますが、virtualの性質は実行時に決定されます.この2つは同時に存在することはできません.1つの選択しかありません.ファイルのinlineキーワードはコンパイラに対するアドバイスにすぎません.コンパイラが採用されているかどうかはコンパイラのことです.
1.インライン関数は静的挙動であり、虚関数は動的挙動であり、それらの間に矛盾がある.
2.インライン関数のような虚関数がいくつか見られるのは、ある関数がインライン関数であるかどうかは私たちが言った計算ではなく、コンパイラによって決まるからです.コンパイラに提案するしかありません.ある関数はインライン関数(inlineキーワード)ですが、コンパイラには独自の判断法則があります.このような状況になる可能性があります
2.1 inlineで宣言した関数にはinlineがありません
2.2 inlineで宣言していない関数はinlineです
2.3 inline関数の場合、コンパイラはアドレス付き関数にコンパイルします.
したがって,状況は複雑でhigh-levelから見ると関数がinlineであるか否かを判断するのは困難であり,low-levelから見ると比較的明確であり,非インライン関数は関数呼び出しメカニズムに従い,アセンブリではcallで呼び出される.インライン関数にはこれらはありません.
inline関数は、この関数がインラインであることを示す、コンパイラは、その関数を呼び出す場所で直接関数のコードを展開してcallerのコードに挿入することを提案する.これは、インラインされるかどうかを示すものにすぎません.コンパイラは、inlineと宣言された関数の内部構造、例えば、ループが含まれているかどうか、複雑な関数呼び出しなどに基づいてinlineかどうかを選択します.
1.虚関数がインラインされないことは疑いの余地がない.虚関数はRuntimeになってこそ、どちらが呼び出されたのかを識別できるが、インラインがコンパイル期間であるとコードが展開され、挿入されるのは明らかに同じではないからだ.
2.inlineには2つの表現があります.1つは、inlineが実装ファイルに(.cpp)表示インラインと呼ばれていることを指摘することです.もう1つは、クラスの宣言と定義が同じファイルに格納されていることを暗黙インラインと言います.しかし、前述したようにinlineはプロンプトにすぎません.インラインがインラインされるかどうかはコンパイラによって計算されます.
 
#include<iostream>
using namespace std;
class A
{
    public:

        inline virtual void virFUn()  //  static 
        {   
            cout<<" A ,inline !"<<endl;
        }   
        void f();
};
inline  void A::f()
{
    cout<<" , !"<<endl;
}
class B:public A
{
    public:
        virtual void virFUn() 
        {   
            cout<<" B !"<<endl;
        }   
};
int main()
{
    A * pa; 
    B b;
    pa = &b; 
    pa->virFUn();
    A a;
    a.f();

}   

 
ps:inlineとマークされた関数がコンパイラによってインライン関数として処理されているかどうかをどのように検出しますか.ここでは、nmを使用してインライン関数を呼び出すターゲットファイルを表示し、inline関数の記号が見つかった場合、インライン関数として扱われていないことを示し、見つからなかった場合、コンパイラがインライン関数として扱われていることを示します.インラインとマークされた関数がインライン関数として扱われている場合、コンパイラは呼び出しタグを直接コードで置き換えるべきであるため、インライン関数のある記号を見るべきではない.