美文网首页
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++ 空基类优化

    1简介: 空基类优化,即当存在空的基类子对象时,可以将其默认规定的占位字节忽略 2使用环境和注意点: (2.1) ...

  • 【C++ Templates(19)】模板与继承

    空基类优化(EBCO) 布局原则 C++不允许类大小为0,比如数组元素为类,若类大小为0则数组大小也是0,这样会导...

  • 18 模板与继承

    空基类优化(EBCO) 布局原则 C++不允许类大小为0,比如数组元素为类时,若类大小为0则数组大小也是0,这会导...

  • 虚继承与空基类优化

    首先介绍一下虚继承吧。 在虚继承下,对给定虚基类,无论该类在派生层次中作为虚基类出现多少次,只继承一个共享的基类子...

  • 10 多态 抽象

    /*多态本质:c++ 允许将派生类对象的地址赋予基类的指针所有派生类的本质都是is a 的基类基类的指针调用任何方...

  • c++继承

    在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生...

  • C++ 虚函数

    C++多态--虚函数virtual及override 如果 不是虚函数,指向子类对象的基类指针只能调用基类的函数,...

  • C++ 类继承

    C++类的继承要点: 派生类不能直接访问基类的私有成员变量,只能通过基类的公有或保护方法进行访问。 创建派生类对象...

  • C++ 虚基类

    注意:本文中代码均使用 Qt 开发编译环境 《虚基类》 当某类的部分或者全部直接基类是从另一个共同基类派生而来时,...

  • 网易云课堂(Boolan)C++ 第四周笔记

    关于C++类的大小(size) 1. 空类 class AA{ }; #include int main() { ...

网友评论

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

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