C++ | class size
c++类大小和机器还有编译器有关。64位机器指针大小为8个字节,32位机器为4个字节。
- 每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址;
- 有虚函数的类有个virtual table(虚函数表),里面包含了类的所有虚函数,类中有个virtual table pointers,通常成为vptr指向这个virtual table;
- 有多个父类的,会维护多个虚函数指针,第一个指向第一个基类的虚函数表(并且带上在类中定义的虚函数),第二个指针指向第二个基类的虚函数表...以此类推。
- 虚继承,还有一个指向父类的指针,该指针为指向虚基类的指针(Pointer to virtual base class);
#include <iostream>
using namespace std;
class A {};
class B {};
class C : public A {
virtual void func() = ;
};
class D : public B, public C {};
class E {
public:
virtual void e() {};
private:
char abc[];
};
class F : public E {
public:
virtual void f() {};
};
class G : virtual public E {};
class H {
public:
virtual void h() {};
private:
char abc[];
};
class I : public E, public H {};
class J : virtual public E {};
class K : public G, public J {};
class L {
static int l;
static void la() { static int m; }
};
int main() {
cout << "sizeof(A) = " << sizeof(A) << endl; // 空类,大小为1
cout << "sizeof(B) = " << sizeof(B) << endl; // 空类,大小为1
cout << "sizeof(C) = " << sizeof(C) << endl; // 虚函数表指针 (64位机器指针为8个字节)
cout << "sizeof(D) = " << sizeof(D) << endl; // 虚函数表指针
cout << "sizeof(E) = " << sizeof(E) << endl; // 字节对齐+虚函数表指针(8 + 8)
cout << "sizeof(F) = " << sizeof(F) << endl; // 同E
cout << "sizeof(G) = " << sizeof(G) << endl; // 虚继承,还包含一个父类的指针,所以是父类指针 + 虚函数表指针 + 字节对齐 = 24
cout << "sizeof(H) = " << sizeof(H) << endl; // 同E
cout << "sizeof(I) = " << sizeof(I) << endl; // 两个虚函数指针分别指向E和H + 两个数组字节对齐 = 32
cout << "sizeof(J) = " << sizeof(J) << endl; // 同G
cout << "sizeof(K) = " << sizeof(K) << endl; // 一个指向父类(E)的指针 + 两个虚函数指针分别指向G和J + 一个字节对齐 = 32
cout << "sizeof(L) = " << sizeof(L) << endl; // 静态变量不占空间
return ;
}
输出:
sizeof(A) =
sizeof(B) =
sizeof(C) =
sizeof(D) =
sizeof(E) =
sizeof(F) =
sizeof(G) =
sizeof(H) =
sizeof(I) =
sizeof(J) =
sizeof(K) =
sizeof(L) =
C++ | class size的更多相关文章
- Uncaught RangeError: Maximum call stack size exceeded 调试日记
异常处理汇总-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 开发道路上不是解决问题最重要,而是解决问题的过程,这个过程我们称之为~~~调试 记 ...
- IOS 杂笔-11(实现在外部无法改变UIView的size)
我想题目说的或许不是很清楚,那么现在我详细介绍一下这篇随笔内容. 在外部无法改变UIVIew控件的size. 这里说是UIView,但是事实上,是大多数控件而绝非仅UIView. 想要实现在外部无法改 ...
- String构造器中originalValue.length>size 发生的情况
最近在看Jdk6中String的源码的时候发现String的有个这样的构造方法,源代码内容如下: public String(String original) { int size = origina ...
- [LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k
Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...
- [LeetCode] Minimum Size Subarray Sum 最短子数组之和
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...
- Uncaught RangeError: Maximum call stack size exceeded 超出最大调用值(个人解释)
写了段jq后,报这个错,度娘未解,灵光一闪,找到原因,上代码: Html 结构: <a href="javascript:;" class="item-pic&qu ...
- LeetCode 209 Minimum Size Subarray Sum
Problem: Given an array of n positive integers and a positive integer s, find the minimal length of ...
- jq size()与length的区别
size()跟length同样的功能,都是取元素的个数,那么他们的区别是什么呢,一个是方法一个是属性? 从图中可以看到size()方法比length慢38%,原因何在? size: function ...
- FTP命令 - Size的问题
今天发现一个服务从某一个外接系统(Linux)FTP取到的文件大小和下载后的文件大小总是不一致. 开始以为是程序那里出错了.但是找来找去发现不了原因.后来用FTP工具上去执行SIZE命令,终于发现返回 ...
- unity3d中获得物体的size
以size的x方向为例 1:gameObject.renderer.bounds.size.x;//这个值的结果真实反应出有MeshRenderer这个组件的模型的尺寸.不需要再乘以localScal ...
随机推荐
- layer父页面调用子页面的方法
由于不知道如何在子页面获取到layer定义的确定按钮,于是就在子页面上定义了一个方法,然后在由父页面在点确定按钮时调用子页面所定义的这个方法,从而执行子页面方法里面的内容: 子页面代码: functi ...
- sql中保留一位小数的百分比字符串拼接,替换函数,换行符使用
select num ,cast(round(convert(float,isnull((a.Sum_Num-d.Sum_Num),0))/convert(float,c.Sum_Store_Num ...
- Eclipse 读取config目录下文件
最近在一个项目,在项目下新建了一个config配置文件夹,添加一个配置文件config.properties. 使用classpath:config.properties方式加载配置文件, 具体实现代 ...
- 59、小米电视安装apk(无u盘操作)
第一步 打开电视或者盒子,找到应用商店 第二步 打开应用商店 第三步.打开应用商店后,找到用户,别切换到快捷安装 第四步.记住地址,使用在同一网络下的电脑打开此网页 第五步.页面效果如图 第六步.找到 ...
- 报错: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: An attempt by a client to checkout a Connection has timed out. 数据库连接超时
解决方法一: [oracle@data ~]$ sqlplus / as sysdba——连接到数据库 SQL*Plus: Release 11.2.0.4.0 Production on Mon M ...
- jmeter快捷键
快捷键 功能 备注 Ctrl + C 复制 可复制组件 Ctrl + V 粘贴 可粘贴组件 Ctrl + Shift + C 复制粘贴当前组件到下一行 Ctrl + R 运行测试计划 Ctrl ...
- python 学习分享-装饰器篇
本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...
- 单元测试如何保证了易用的API
一般而言TDD的好处是以输出为导向及早发现问题,以及方便重构(单元测试保证).我理解,还有一个比较重要的意义是: 客观上强制了程序员写出更加友好的接口 方便测试和联调. 问题 这里我以c++举例,需求 ...
- [报错处理]Could not find a version that satisfies the requirement xml (from versions)
安装xml库发生报错 pip3 install xml Collecting xml Could not find a version that satisfies the requirement x ...
- nyoj 1282 部分和问题
部分和问题(入门题) 时间限制:1000 ms | 内存限制:65535 KB 难度:0 描述 给你n个数(a1,a2,a3.......an) ,是否存在某一些数字加起来等于k,有就输出 & ...