类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的。

示例如下:

(一)

class CBase
{
}; sizeof(CBase)=1;

为什么空的类什么都没有是 1 呢?

c++要求每个实例在内存中都有独一无二的地址。空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的 sizeof 为 1。

(二)

class CBase
{
int a;
char p;
}; sizeof(CBase)=8;

记得对齐的问题,这点和 struct 的对齐原则很像!int 占 4 字节,char 占一字节,补齐 3 字节。

(三)

class CBase
{
public:
CBase(void);
virtual ~CBase(void); private:
int a;
char *p;
}; sizeof(CBase)=12

C++ 类中有虚函数的时候有一个指向虚函数的指针,在 32 位系统分配指针大小为 4 字节。无论多少个虚函数,只有这一个指针,4 字节。注意一般的函数是没有这个指针的,而且也不占类的内存。

(四)

class CChild : public CBase
{
public:
CChild(void);
~CChild(void); virtual void test();
private:
int b;
}; sizeof(CChild)=16;

可见子类的大小是本身成员变量的大小加上父类的大小。其中有一部分是虚拟函数表的原因,父类子类共享一个虚函数指针。

(五)

#include<iostream.h>

class a {};

class b{};

class c:public a
{
virtual void fun()=0;
}; class d:public b,public c
{
}; int main()
{
cout<<"sizeof(a)"<<sizeof(a)<<endl;
cout<<"sizeof(b)"<<sizeof(b)<<endl;
cout<<"sizeof(c)"<<sizeof(c)<<endl;
cout<<"sizeof(d)"<<sizeof(d)<<endl; return 0;
} sizeof(a)=1
sizeof(b)=1
sizeof(c)=4
sizeof(d)=8

注意第三种情况和第四种情况。

(六)

#include<iostream>
using namespace std; class A
{
char a[3];
public:
virtual void fun1(){};
}; class B : public virtual A
{
char b[3];
public:
virtual void fun2(){};
}; class C : public virtual B
{
char c[3];
public:
virtual void fun3(){};
}; int main()
{
cout << sizeof(A) << endl; // 8
cout << sizeof(B) << endl; // 8(A) + 12(B)
cout << sizeof(C) << endl; // 8(A) + 12(B) + 12(C)
return 0;
} sizeof(A)=8
sizeof(B)=20
sizeof(c)=32

注意,虚继承的时候A B C三个类不仅不会共享虚基类指针,也不会共享虚表指针,要和普通继承区分开来。

具体分析如下:

 class A size(8):
+---
0 | {vfptr}
4 | a
| <alignment member> (size=1)
+--- class B size(20):
+---
0 | {vfptr}
4 | {vbptr}
8 | b
| <alignment member> (size=1)
+---
+--- (virtual base A)
12 | {vfptr}
16 | a
| <alignment member> (size=1)
+--- class C size(32):
+---
0 | {vfptr}
4 | {vbptr}
8 | c
| <alignment member> (size=1)
+---
+--- (virtual base A)
12 | {vfptr}
16 | a
| <alignment member> (size=1)
+---
+--- (virtual base B)
20 | {vfptr}
24 | {vbptr}
28 | b
| <alignment member> (size=1)
+---

总结

空的类是会占用内存空间的,而且大小是 1,原因是 C++ 要求每个实例在内存中都有独一无二的地址。

(一)类内部的成员变量:

  • 普通的变量:是要占用内存的,但是要注意对齐原则(这点和 struct 类型很相似)。
  • static 修饰的静态变量:不占用内容,原因是编译器将其放在全局变量区。

(二)类内部的成员函数:

  • 普通函数:不占用内存。
  • 虚函数:有一个指向虚函数的指针,要占用 4 个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的,和虚函数的个数是没有关系的。

说明:此博文转载之http://blog.sina.com.cn/s/blog_69c189bf0100mkeu.html

C++入门知识点总结的更多相关文章

  1. Java入门知识点

    Java入门知识点   Java源代码的流程 Java程序由.java文件生成,通过JVM进行编译得到字节文件.class class HelloWorld { public static void ...

  2. Kotlin新语言简介和快速入门知识点

    Kotlin新语言简介和快速入门知识点 简介:Kotlin是最近由JetBrains发布的一种基于JVM的编程语言,已经被Google宣布为开发Android App的一级语言Kotlin有着与Jav ...

  3. css入门知识点整理

    css入门知识点整理 不要嘲笑我这个蒟蒻..例子来源:w3school css其实就分为两个东西,一个是选择器,另外一个是声明.声明定义了某个对象的属性的值,这都是html的内容.重点要关注的是选择器 ...

  4. 新手学Java,有哪些入门知识点?

    很多小伙伴们在刚接触Java的时候,会有些迷茫,不知道该从哪里入手,不管是做前端还是后端,程序员都会用到JAVA,那该掌握哪些必要的基础知识呢.今天就跟大家分享新手学Java,有哪些入门知识点? 下面 ...

  5. 微信小程序入门知识点总结

    微信小程序入门知识点总结 前情介绍 ​ 微信小程序就不多介绍了,我们想要开发微信小程序首先得到微信公众平台 下方的小程序处注册相关账号并登录,接着填写小程序相关资料.在设置处可找到AppID用以开发微 ...

  6. C/C++编程笔记:C语言入门知识点(三),请收藏C语言最全笔记!

    今天我们继续来学习C语言的入门知识点,第一课:C/C++编程笔记:C语言入门知识点(二),请收藏C语言最全笔记! 21. 输入 & 输出 当我们提到输入时,这意味着要向程序填充一些数据.输入可 ...

  7. C/C++编程笔记:C语言入门知识点(二),请收藏C语言最全笔记!

    今天我们继续来学习C语言的入门知识点 11. 作用域规则 任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量: 在函数或块内部的局部变量 ...

  8. C++语言入门知识点(详细版)【持续更新每周三更】,小舒舒戳这里!!!

    时间过得好快啊,LITTLESUN已经在这块新地图摸打滚爬了一个多月了.前一段时间出了点小意外一直没能更新博客,昨天被小舒舒催更了(惭愧惭愧)便准备着手来一篇回忆录回首一下这一个月走过的风风雨雨,也希 ...

  9. React入门知识点清单

    做前端的一定都知道现在是三大框架--Vue.React.Angular三足鼎立的时代.Vue是公认的最容易入门的,因为它文件结构上有传统的HTML的影子,让刚接触它的前端人员刚到很"亲切&q ...

  10. MyBatis基础入门--知识点总结

    对原生态jdbc程序的问题总结 下面是一个传统的jdbc连接oracle数据库的标准代码: public static void main(String[] args) throws Exceptio ...

随机推荐

  1. 矩阵奇异值分解(SVD)

    转自:https://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html  (感谢,讲解的太好了) 在机器 ...

  2. java递归删除文件及目录

    package base; import java.io.File; public class delete {     public static void main(String[] args) ...

  3. Find Minimum in Rotated Sorted Array 旋转数组中找最小值 @LeetCode

    O(n)的算法就不说了,这题主要考查的是 O(logn)的算法. 有序数组easy想到使用二分查找解决.这题就是在二分基础上做一些调整.数组仅仅有一次翻转,能够知道原有序递增数组被分成两部分,这俩部分 ...

  4. HTTP协议漫谈 C#实现图(Graph) C#实现二叉查找树 浅谈进程同步和互斥的概念 C#实现平衡多路查找树(B树)

    HTTP协议漫谈   简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲 ...

  5. DLR之 ExpandoObject和DynamicObject的使用演示样例

    ExpandoObject :动态的增删一个对象的属性,在低层库(比如ORM)中非常实用.因为ExpandoObject实现了IDictionay<string, object>接口,常见 ...

  6. VS2010打开高版本VS解决方案

    http://blog.csdn.net/backspace110/article/details/62111273 Microsoft Visual Studio Solution File, Fo ...

  7. Ubuntu linux 返回上一次访问的目录

    cd - (cd空格 减号)返回最近一次访问的目录 这个非常方便.平时经常用终端切换目录,能够方便地回到原来的目录就很爽了. jiqing@jiqing-pad:/usr/local/redis/sr ...

  8. SERVLET类常用接口及方法

    SERVLET类常用接口及方法 2011-09-09 16:14:43    [size=xx-small]SERVLET类常用接口及方法2007年04月05日 星期四 04:46 P.M.基本类和接 ...

  9. hadoop-3.0.0-alpha4安装部署过程

    关闭防火墙 #systemctl stop firewalld.service #停止firewall #systemctl disable firewalld.service #禁止firewall ...

  10. bzoj 1086 王室联邦 —— 思路题

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1086 一眼看去很是不会,于是看看TJ... https://blog.csdn.net/ly ...