美文网首页
C++ 空基类优化

C++ 空基类优化

作者: KinoluKaslana | 来源:发表于2018-10-07 11:41 被阅读0次

    1简介:

    空基类优化,即当存在空的基类子对象时,可以将其默认规定的占位字节忽略

    2使用环境和注意点:

    (2.1)

    空基类优化是由于,对于一个空类对象而言,为了保证其地址的唯一性,所以其大小必大于等于1以保证占据相应的地址,但是对于基类而言,特别是,对于C++中的standard layout(在这里)由于要保证标准导出,并且可以直接通过reinterpret_cast转型为其第一个非静态数据成员,又由于其特性,导致其基类必为不含非静态数据成员(即为空),从而必须要求使用空基类优化

    (2.2)

    优化的条件即为,基类为空,且基类不存在vtp而且其派生类的第一个非静态数据成员不为当前继承的空基类,那么就会发生优化

    (2.3)

    注意,优化仅发生在以上条件,在其他位置(非第一个非静态成员),存在空基类数据成员时,不发生优化,遵循唯一地址和内存对齐规定

    (2.4)

    在C++20起存在属性no_unique_address即不使用地址位置,那么此时不管空类对象在那个位置,都将被优化掉.


    例子:

    #include<iostream>
    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)<<" "<<sizeof(C1)<<" "<<sizeof(C2)<<" "<<sizeof(C3)<<std::endl;
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:C++ 空基类优化

          本文链接:https://www.haomeiwen.com/subject/fsxlaftx.html