c++类大小和机器还有编译器有关。64位机器指针大小为8个字节,32位机器为4个字节。

  1. 每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址;
  2. 有虚函数的类有个virtual table(虚函数表),里面包含了类的所有虚函数,类中有个virtual table pointers,通常成为vptr指向这个virtual table;
  3. 有多个父类的,会维护多个虚函数指针,第一个指向第一个基类的虚函数表(并且带上在类中定义的虚函数),第二个指针指向第二个基类的虚函数表...以此类推。
  4. 虚继承,还有一个指向父类的指针,该指针为指向虚基类的指针(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的更多相关文章

  1. Uncaught RangeError: Maximum call stack size exceeded 调试日记

    异常处理汇总-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 开发道路上不是解决问题最重要,而是解决问题的过程,这个过程我们称之为~~~调试 记 ...

  2. IOS 杂笔-11(实现在外部无法改变UIView的size)

    我想题目说的或许不是很清楚,那么现在我详细介绍一下这篇随笔内容. 在外部无法改变UIVIew控件的size. 这里说是UIView,但是事实上,是大多数控件而绝非仅UIView. 想要实现在外部无法改 ...

  3. String构造器中originalValue.length>size 发生的情况

    最近在看Jdk6中String的源码的时候发现String的有个这样的构造方法,源代码内容如下: public String(String original) { int size = origina ...

  4. [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 ...

  5. [LeetCode] Minimum Size Subarray Sum 最短子数组之和

    Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...

  6. Uncaught RangeError: Maximum call stack size exceeded 超出最大调用值(个人解释)

    写了段jq后,报这个错,度娘未解,灵光一闪,找到原因,上代码: Html 结构: <a href="javascript:;" class="item-pic&qu ...

  7. LeetCode 209 Minimum Size Subarray Sum

    Problem: Given an array of n positive integers and a positive integer s, find the minimal length of ...

  8. jq size()与length的区别

    size()跟length同样的功能,都是取元素的个数,那么他们的区别是什么呢,一个是方法一个是属性? 从图中可以看到size()方法比length慢38%,原因何在? size: function ...

  9. FTP命令 - Size的问题

    今天发现一个服务从某一个外接系统(Linux)FTP取到的文件大小和下载后的文件大小总是不一致. 开始以为是程序那里出错了.但是找来找去发现不了原因.后来用FTP工具上去执行SIZE命令,终于发现返回 ...

  10. unity3d中获得物体的size

    以size的x方向为例 1:gameObject.renderer.bounds.size.x;//这个值的结果真实反应出有MeshRenderer这个组件的模型的尺寸.不需要再乘以localScal ...

随机推荐

  1. SVM python小样例

    SVM有很多种实现,但是本章只关注其中最流行的一种实现,即序列最小化(SMO)算法在此之后,我们将介绍如何使用一种称为核函数的方式将SVM扩展到更多的数据集上基于最大间隔的分割数据优点:泛化错误率低, ...

  2. SSRS 报表管理器 http://localhost/Reports HTTP500 内部错误处理过程

    原文地址:http://www.cnblogs.com/zzry/p/5716056.html 安装了很多机器的sqlserverBI 组件 初始安装配置下 浏览报表管理器 http://localh ...

  3. nginx 同一 iP 多域名配置方法(多文件)

    一.Nginx 配置文件(nginx version: nginx/1.12.2) 路径:/usr/local/nginx/conf/nginx.conf 操作:在 http 模块增加(子配置文件的路 ...

  4. phpMyAdmin 4.7.x CSRF

    phpMyAdmin 4.7.x CSRF 场景:管理员登陆phpmyadmin之后,我试验了一下,发现只要是登陆session没有失效应该是都可以的, 利用,phpmyadmin可以通过get方式操 ...

  5. CSU-ACM寒假集训选拔-入门题

    CSU-ACM寒假集训选拔-入门题 仅选择部分有价值的题 J(2165): 时间旅行 Description 假设 Bobo 位于时间轴(数轴)上 t0 点,他要使用时间机器回到区间 (0, h] 中 ...

  6. pythonic编程示例及简析

    1.列表 list[起始:结尾:增量] 值传递与地址传递 a = [2,1] b = a #地址传递 b = a[:] 值传递 a.sort() print a #[1,2] print b #[1, ...

  7. [python][django学习篇][4]django完成数据库代码翻译:迁移数据库(migration)

    上一篇我们已经完成数据库的设计,但是仅仅是python语言,并没有真正创建了数据库表.翻译成数据库语言,真正创建数据库表由django manage.py来实现,这一过程专业术语:迁移数据库 切换到m ...

  8. TOJ 3974: Region n条直线m个圆最多将圆分为几个区域

    3974: Region  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 33     ...

  9. python 打印9*9乘法表

    # -*- coding: utf8 -*- # Author:wxq 1. for i in range(1,10): for j in range(1,i+1): print "%d*% ...

  10. maven学习(四)——maven项目构建过程

    一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立Maven约定的目录结构和pom.xml文件 Hello | --src | -----main | ----- ...