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 ...
随机推荐
- SVM python小样例
SVM有很多种实现,但是本章只关注其中最流行的一种实现,即序列最小化(SMO)算法在此之后,我们将介绍如何使用一种称为核函数的方式将SVM扩展到更多的数据集上基于最大间隔的分割数据优点:泛化错误率低, ...
- SSRS 报表管理器 http://localhost/Reports HTTP500 内部错误处理过程
原文地址:http://www.cnblogs.com/zzry/p/5716056.html 安装了很多机器的sqlserverBI 组件 初始安装配置下 浏览报表管理器 http://localh ...
- nginx 同一 iP 多域名配置方法(多文件)
一.Nginx 配置文件(nginx version: nginx/1.12.2) 路径:/usr/local/nginx/conf/nginx.conf 操作:在 http 模块增加(子配置文件的路 ...
- phpMyAdmin 4.7.x CSRF
phpMyAdmin 4.7.x CSRF 场景:管理员登陆phpmyadmin之后,我试验了一下,发现只要是登陆session没有失效应该是都可以的, 利用,phpmyadmin可以通过get方式操 ...
- CSU-ACM寒假集训选拔-入门题
CSU-ACM寒假集训选拔-入门题 仅选择部分有价值的题 J(2165): 时间旅行 Description 假设 Bobo 位于时间轴(数轴)上 t0 点,他要使用时间机器回到区间 (0, h] 中 ...
- pythonic编程示例及简析
1.列表 list[起始:结尾:增量] 值传递与地址传递 a = [2,1] b = a #地址传递 b = a[:] 值传递 a.sort() print a #[1,2] print b #[1, ...
- [python][django学习篇][4]django完成数据库代码翻译:迁移数据库(migration)
上一篇我们已经完成数据库的设计,但是仅仅是python语言,并没有真正创建了数据库表.翻译成数据库语言,真正创建数据库表由django manage.py来实现,这一过程专业术语:迁移数据库 切换到m ...
- TOJ 3974: Region n条直线m个圆最多将圆分为几个区域
3974: Region Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: 33 ...
- python 打印9*9乘法表
# -*- coding: utf8 -*- # Author:wxq 1. for i in range(1,10): for j in range(1,i+1): print "%d*% ...
- maven学习(四)——maven项目构建过程
一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立Maven约定的目录结构和pom.xml文件 Hello | --src | -----main | ----- ...