美文网首页
C++对象模型——1.没有继承结构的类布局

C++对象模型——1.没有继承结构的类布局

作者: loki528 | 来源:发表于2019-11-06 16:31 被阅读0次

注: 64位VS下测试的结果,g++的实现可能不一样

#include <iostream>
using namespace std;

class A {
public:
    int a;
    virtual ~A() {
        a = 0;
    }
};

int main()
{
    A* pa = new A();
    cout << sizeof(A) << endl;
    delete pa;
    return 0;
}

输出

16
VS监视中pa的值

通过监视窗口可以看到pa指向的内存包含了两个成员:__vfptr和a。
__vfptr是个指针,指向一个数组。

A的对象模型为:

成员 对象内起始位置 占用字节
__vftpr 0 8
a 8 4
(对齐补充) 12 4

__vfptr存储的是A的虚表的地址,这个虚表目前只有一项,存储的是A的虚析构函数的地址~A。

为什么sizeof(A) == 16 而不是12?
因为默认情况下,编译器要保证通过数组方式访问A的成员的时候也是高效的,不管是隐式的__vfptr还是显式的a。
当按照如上所示布局的时候,读取__vfptr和a只需要一个周期。即使是访问A的数组中的成员的时候也是这样的。
但是如果按照12字节对齐,第二个A对象的__vfptr的地址就不是8字节对齐,访问__vfptr的时候,需要读取16字节,然后获取中间的8个字节。同样的汇编代码,但是系统会做更多的事情。效率自然低一些。

__vfptr是编译器在类中添加的成员,对程序员透明的。
当类中有虚函数,包括从基类继承的虚函数时,__vfptr都会存在,具体__vfptr的位置和数量跟类的继承结构有关系。

相关文章

  • C++对象模型——1.没有继承结构的类布局

    注: 64位VS下测试的结果,g++的实现可能不一样 输出 通过监视窗口可以看到pa指向的内存包含了两个成员:__...

  • 结构型模式概述(7种)

    结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接...

  • 2021-07-18 结构型模式

    结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接...

  • 面向对象技术|结构型模式

    结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接...

  • Kotlin 类、对象和接口(三)——编译器生成的方法:数据类和

    Kotlin 类、对象和接口(一)——定义类继承结构Kotlin 类、对象和接口(一)——定义类继承结构 Java...

  • 继承与接口

    继承方式 如果不指定public,C++默认的继承是私有继承..1.公有继承:派生类的对象可以访问基类中的公有成员...

  • C++编程知识分享:C++对象模型(二)

    话不多聊,我们接着来看! C++对象模型中加入虚继承 虚继承是为了解决重复继承中多个间接父类的问题的,所以不能使用...

  • C++笔记五(面向对象编程下)

    十六 对象模型:关于vptr和vtbl 如图模型所示,B类继承A类,C类继承B类,子类有父类的成分,继承的包括数据...

  • 【C++】C++学习笔记之十七:对象模型

    C++对象模型 各种关系下的构造和析构 继承关系下的构造和析构 正常情况下,带有继承关系的类对象的构造是由内而外,...

  • 对象的分类

    对象的分类 对象分为 实例对象、类对象、元类对象 对象的数据结构 1. 实例对象 转化成c++代码以后可以发现 可...

网友评论

      本文标题:C++对象模型——1.没有继承结构的类布局

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