C++对象内存布局

#include <iostream>
using namespace std;
//本程序在VS2010 和 Linux 下测试。
/*类之间的关系图:
       _____
      |__X__|
      /v    \v
   _____     _____
  |__Y__|   |__Z__| 
  (v)\ _____ /(v)
      |__A__| 
         |
       _____    
      |__B__|
*/

class X
{
public:
	X(int a): x(a){};
	virtual ~X(){};
//protected:
	int x;
};

class Y: virtual public X 
{
public:
	Y(int a, int b): X(a), y(b){};
//protected:
	int y;
};

class Z: virtual public X 
{
public:
	Z(int a, int b): X(a), z(b){};
//protected:
	int z;
};

/*
class A: public Y, public Z //A不是虚继承
{
public:
	A(int ax, int bx, int cx): X(ax), Y(ax, bx), Z(ax, bx), a(cx){};
//	virtual void test(){};
	int a;
};
*/

/*
class B: public A //A不是虚继承
{
public:
	B(int ax, int bx, int cx, int dx): X(ax),  A(ax, bx, cx), b(dx){};
	int b;
};
*/

class A: virtual public Y, virtual public Z//A是虚继承
{
public:
	A(int ax, int bx, int cx): X(ax), Y(ax, bx), Z(ax, bx), a(cx){};
	int a;
};

class B: public A //A是虚继承
{
public:
	B(int ax, int bx, int cx, int dx): X(ax), Y(ax, bx), Z(ax, bx),  A(ax, bx, cx), b(dx){};
	int b;
};

int main()
{
	X xx(1);
	Y yy(1, 2);
	Z zz(1, 2);
	A aa(1, 2, 3);
	B bb(1, 2, 3, 4);

	cout<<"SIZE of xx: "<<sizeof(xx)<<endl; //8
	cout<<"address of xx && xx.x: "<<&xx<<"  "<<&xx.x<<endl; // 0013F910  0013F914 说明vptr放在成员之前,布局为:vptr_x, x

	cout<<"SIZE of yy: "<<sizeof(yy)<<endl; //16
	cout<<"address of yy && yy.y && yy.x: "<<&yy<<"  "<<&yy.y<<"  "<<&yy.x<<endl;//0028F8F8  0028F8FC  0028F904 说明布局为: vptr_y, y, vptr_x, x 

	cout<<"SIZE of zz: "<<sizeof(zz)<<endl; //16 同Y
	cout<<"address of zz && zz.z && zz.x: "<<&zz<<"  "<<&zz.z<<"  "<<&zz.x<<endl;

	cout<<"SIZE of aa: "<<sizeof(aa)<<endl; //28 A不是虚继承, 且A的所有虚函数已经包含在X中了,所以自己不需要vptr_a,如果A中添加虚函数test则在最顶端添加vptr_a
	                                        //32 A是虚继承,有vprt_a
	cout<<"address of aa && aa.a && aa.y && aa.z && aa.x: "<<&aa<<"  "<<&aa.a<<"  "<<&aa.y<<"  "<<&aa.z<<"  "<<&aa.x<<endl;
	                                        //A不是虚继承:0025FA3C  0025FA4C  0025FA40  0025FA48  0025FA54 布局为vptr_y, y, vptr_z, z, a, vptr_x, x (先确定基类)
								            //A是虚继承:  001BF800  001BF804  001BF814  001BF81C  001BF80C 布局为vptr_a, a, vptr_x, x, vptr_y, y, vptr_z, z(先确定A中不变部分)
	cout<<"SIZE of bb: "<<sizeof(bb)<<endl; //32  A不是虚继承
	                                        //36  A是虚继承
	cout<<"address of bb && bb.y && bb.z && bb.a && bb.b && bb.x: "<<&bb<<"  " <<&bb.y<<"  "<< &bb.z<<" "<<&bb.a<<"  "<<&bb.b<<"  "<<&bb.x<<endl;
	                                        //A不是虚继承:        0027F954     0027F958      0027F960     0027F964     0027F968    0027F970 布局为vptr_y, y, vptr_z, z, a, b, vptr_x, x
	                                        //A是虚继承:          0022F78C     0022F7A4      0022F7AC     0022F790     0022F794    0022F79C 布局为vptr_a, a, b, vptr_x, x, vptr_y, y, vptr_z, z
}

vptr放在数据成员前。

a:
   1. 对于普通继承(不管包不包括虚函数),都是按照继承顺序从左至右先为基类对象分配内存,再为派生类分配

   2. 存在虚函数时,如果派生类中没有新增虚函数,则只需要基类的虚函数指针vptr即可,否则还要新增一个自己的vptr,多重继承时每个包含虚函数的分支的基类都要有vptr;

b:

   虚继承时,先为本类中不变部分分配内存,再确定共享部分的内存;虚继承一定需要vptr来存储共享部分的偏移。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值