深度探索C++オブジェクトモデルの要点

2061 ワード

(1)クラス内のメンバー変数が内蔵タイプであれば,クラスは構造関数を合成しない.場合によっては構造関数が合成されます
         1.classにメンバー変数が含まれ、そのメンバー変数にコピーコンストラクタがある場合
         2.classがベースクラスから継承され、ベースクラスにコピーコンストラクタがある場合
         3.classが1つ以上の虚関数を宣言すると
         4.classが継承シリアルチェーンから派生すると、1つ以上のダミーベースクラスがあります.
(2)クラスBaseと継承クラスBaseのサブクラスDerived,このような付与があればBase=derived;クラスカットが発生し、derivedクラスに虚関数がある場合はderivedクラスのvptrも一緒にコピーされ、単純なbitwiseコピーであればbaseとderivedは同じ虚関数テーブルを指し、エラーが発生します.では、コピー時にコンパイラはこのコピーが深いコピー(呼び出されるのはbaseのコピー構造関数)であることをデフォルト化し、baseに別の虚関数テーブルを作成しますが、虚関数テーブルの内容も変更され、単純に値をコピーするわけではありません.コンパイラが構築したコピー構造関数がこの仕事を担当していると推測できる.
(3)クラスにメンバー変数やメンバー関数がない場合、このクラスのサイズも0ではありません.コンパイラがこっそり仕事をしているからです.クラスサイズに追加の負担をもたらすいくつかの理由は、1.虚関数テーブルのポインタ.クラスに虚関数がある場合は、クラスに虚関数ポインタが保存されます.2:Alignmentの制限は、メモリ内での対応を保証するため、32ビットのオペレーティングシステムはクラスのサイズを4バイトの整数倍にし、クラスの実際のサイズが要求に達していない場合、コンパイラはこのような長さの要求に達する空間を補充します.3.クラスに何もない場合、コンパイラはこっそりcharを1バイト追加し、同じクラスの2つの異なるインスタンスが同じメモリアドレスを占有することはありません.
(4)staticメンバー関数はconst,virtual,volatileに修飾できない.クラス内の純粋な虚関数も定義できます.
(5)クラス内のvirtual関数の導入は、クラスの膨張をもたらす.
Point*
Point::Point(float x ,float y ): _x(x),_y(y)
{
}
         
Point*
Point::Point( Point* this ,float x ,float y )
{
     //      ,    
     this->_vptr_Point = vtbl_Point;
    //       
     this_x = x ; 
     this_y = y ;
}
(6)c++         template exception handling(eh) runtime type indentification(RTTI)。RTTI EH    ,     EH    catch     ,     RTTI。 template                       ,   1:          。     100     ,                  ,             ,     193                  。2.       。     template                                 ,            ,template                      。RTTI   downcast  。