类对象模型和this指针
关于类/对象大小的计算
类只是一种类型定义,它本身是没有大小可言的。 我们这里指的类的大小,其实指的是类的对象所占的大小。因此,如果用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。
- 首先,类大小的计算遵循结构体的对齐原则
- 类的大小与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数,静态成员函数,静态数据成员,静态常量数据成员均对类的大小无影响
- 虚函数对类的大小有影响,是因为虚函数表指针带来的影响
- 虚继承对类的大小有影响,是因为虚基表指针带来的影响
- 空类的大小是一个特殊情况,空类的大小为1
类对象的存储方式
静态数据成员之所以不计算在类的对象大小内,是因为类的静态数据成员被该类所有的对象所共享,并不属于具体哪个对象,静态数据成员定义在内存的全局区。同样的类中的成员函数是相同的,对于每一新生成的对象,没有必要为其再存储一份相同的成员函数,成员函数存放在公共代码区
class A1 { //sizeof(A1) = 4
public:
void f1(){}
private:
int _a;
};
// 类中仅有成员函数
class A2 {//sizeof(A2) = 1
public:
void f2() {}
};
// 类中什么都没有---空类
class A3//sizeof(A3) = 1
{};
class base
{//sizeof(base) = 8
private:
static int a;
int b;
char c;
};
注意:派生类继承空类 和一个类包含为空类的成员函数
class Empty {};
struct D : public Empty { int a;};//sizeof(D) = 4
class Empty {};
class HoldsAnInt {
//sizeof(HoldsAnInt) = 8
int x;
Empty e;
};
含有虚函数成员
虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。编译器必需要保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证正确取到虚函数的偏移量)。
每当创建一个包含有虚函数的类或从包含有虚函数的类派生一个类时,编译器就会为这个类创建一个虚函数表(VTABLE)保存该类所有虚函数的地址,其实这个VTABLE的作用就是保存自己类中所有虚函数的地址,可以把VTABLE形象地看成一个函数指针数组,这个数组的每个元素存放的就是虚函数的地址。在每个带有虚函数的类 中,编译器秘密地置入一指针,称为v p o i n t e r(缩写为V P T R),指向这个对象的V TA B L E。 当构造该派生类对象时,其成员VPTR被初始化指向该派生类的VTABLE。所以可以认为VTABLE是该类的所有对象共有的,在定义该类时被初始化;而VPTR则是每个类对象都有独立一份的,且在该类对象被构造时被初始化。
class Base {//sizeof = 4
public:
virtual void f() { cout << "Base::f" << endl; }
virtual void g() { cout << "Base::g" << endl; }
virtual void h() { cout << "Base::h" << endl; }
};
智能推荐
linux后台运行命令总结
linux后台运行命令总结 问题: 我们有时候需要登录远程服务器跑运行时间非常长的脚本,这个时候你要让脚本后台运行,不然占着终端窗口看着不舒服。但万一网络不好,(比如我这儿的破校园网,高峰时几秒钟断一次),终端突然和服务器之间的连接断了,那脚本就会自动停了(因为运行test.sh进程的父进程就是当前的shell终端进程,关闭当前shell终端时,父进程退出,会发送hangup信号给所有子进程,子进...
类对象模型和this指针
关于类/对象大小的计算 类只是一种类型定义,它本身是没有大小可言的。 我们这里指的类的大小,其实指的是类的对象所占的大小。因此,如果用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。 首先,类大小的计算遵循结构体的对齐原则 类的大小与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数,静态成员函数,静态数据成员,静态常量数据成员均对类的大小无影响 虚函数对类的大小有影响,...
3D人脸重建——PRNet网络输出的理解
前言 之前有款换脸软件不是叫ZAO么,分析了一下,它的实现原理绝对是3D人脸重建,而非deepfake方法,找了一篇3D重建的论文和源码看看。这里对源码中的部分函数做了自己的理解和改写。 国际惯例,参考博客: 什么是uv贴图? PRNet论文 PRNet代码 本博客主要是对PRNet的输出进行理解。 理论简介 这篇博客比较系统的介绍了3D人脸重建的方法,就我个人浅显的理解,分为两个流派:1.通过算...
javascript简单的正则表达式入门
内容来自百度前端学院javascript入门课程 基本的HTML: 样式: javascript: document.write和innerHTML有什么区别 前者是直接将内容写入文档流,如果写入之前没有调用document.open,那么回自动调用document.open(每打开一次文档流都会清除之前的所有内容包括变量)。每次写完关闭后重新调用该函数的话,会导致页面重写。 innerHTML是...
猜你喜欢
微信小程序一个你可能需要的功能
根据工作需要。需要做一个图片选中部分区域的效果。百度了很久,都没有见有。于是就自己写了个,需要的可以借鉴下,还有很多需要改善的地方 现在先看看效果 效果图 那这个有什么用呢。。需求是选中图片的某个区域然后给它添加注释。还可以有其他用处。那这个是怎么做到的呢 。。首先我说下基本的思路 ——-> 图片作为一个背景。然后上面是一层canvas 以及最上面生成的view 因为...
Linux Zabbix分布式监控 通过API接口远程 管理Zabbix所监控主机
一、API 1、什么是API API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 Zabbix API允许你以编程方式检索和修改Zabbix的配置,并提供对历史数据的访问。 它广泛用于: 创建新的应用程序以使用Zabbix...
java 调用博思得条码打印机
效果: 打印文字、二维码、图片 准备工作: 1)、JNative(JNative.jar、JNativeCpp.dll) 2)、博思得dll文件(CDFPSK.dll)和API文档 ...
机器学习开源框架系列:Torch:2:MacOS上安装Torch7
由于希望确认一下2015年和2016年的两篇论文相关的内容,这篇文章以官方提示的安装方式为例进行安装方法的memo。 基本信息 项目 说明 官方网站 http://torch.ch/ 开源/闭源 开源 License类别 BSD License 代码管理地址 https://github.com/torch/torch7 开发语言 C,Lua 支持平台 由于使用C和Lua,Torch可以支持多种操...
python数字图像处理:批处理
有时候需要对一批图片处理。这时候可以调用程序自带的图片集合来处理。 skimage.io.ImageCollection(load_pattern,load_func=None) 这个函数是在io模块内,带两个参数,第一个必啊哈四图片数组路径,可以时候一个str字符串。第二个参数是load_func是一个回调函数,我们对图片进行批处理可回调这个函数实现。回调函数默认为imread()即默认这个函数...
