C++空ベースクラス最適化

1046 ワード

1概要:
空のベースクラス最適化、すなわち、空のベースクラスサブオブジェクトが存在する場合、デフォルトで指定された占有バイトを無視できます.
2使用環境と注意点:
(2.1)
空ベースクラスの最適化は、1つの空クラスオブジェクトについて、アドレスの一意性を保証するために、対応するアドレスを占有することを保証するために1以上のサイズを必要とするが、ベースクラスにとって、特にC++のstandard layout(ここでは)は、基準の導出を保証するため、reinterpret_を直接通過することができるcastは、その最初の非静的データメンバーに変換され、その特性により、そのベースクラスが非静的データメンバー(すなわち空)を含まない必要があるため、空のベースクラスの最適化が要求される必要があります.
(2.2)
最適化の条件は、ベースクラスが空であり、ベースクラスにvtpが存在せず、その派生クラスの最初の非静的データメンバーが現在継承されている空のベースクラスではない場合、最適化が発生することです.
(2.3)
なお、最適化は上記の条件のみで発生し、他の場所(最初の非静的メンバー)に空のベースクラスデータメンバーが存在する場合、最適化は発生せず、一意のアドレスとメモリの位置合わせの規定に従う
(2.4)
C++20から属性no_が存在するunique_addressはアドレス位置を使用しないので、このとき空クラスオブジェクトがその位置にあるにかかわらず最適化される.
例:
#include
class Base{
    constexpr static int i = 4;
};
class C1:Base{
    int i = 0;
};
class C2{
    int i = 0;
    Base foo;
    //C++20     [[no-unique_address]]Base foo;      ,sizeof   4.
};
class C3:Base{
    Base foo;
    int i = 0;
};
int main(){
    using std::cout;
    cout<< sizeof(Base)<