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

示例如下:

(一)

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. hotswapagent——热更新代码而无需重启生产环境

    http://blog.csdn.net/littleschemer/article/details/51645722

  2. 使用Guava适配不同的callback

    Cache<Key,Value> cache =CacheBuilder.newBuilder() .maximumSize(1000) .build();// look Ma, no C ...

  3. Python pandas学习笔记

    参考文献:<Python金融大数据分析> #导入模块 import pandas as pd #生成dataframe df = pd.DataFrame([10,20,30,40], c ...

  4. 火狐firefox、谷歌chrome等浏览器扩展、插件介绍

    火狐旧的插件扩展已经不可用,需要更新,这是本人安装的最新的插件 chrome插件 https://www.zhihu.com/question/68338297

  5. FreeFileSync同步定时执行

    Schedule a Batch Job Create a new batch job via FreeFileSync's main dialog: Menu → File → Save as a ...

  6. 最新---java多线程下载文件

    import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; impo ...

  7. C#趣味程序---百鸡百钱

    问题:公鸡一仅仅5元,母鸡一仅仅3元,小鸡三仅仅1元.问100元能够买多少仅仅鸡? using System; namespace ConsoleApplication1 { class Progra ...

  8. POI 的使用

    POI 使用 一. POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能..NET的开发人员则 ...

  9. 分享一个基于Bootstrap的 ACE框架 入门(MVC+EF)

    基于Bootstrap3,拥有强大的功能组件以及UI组件,基本能满足后台管理系统的需求, 而且能根据不同设备适配显示,而且还有四个主题可以切换. 简单入门,源代码下载:https://github.c ...

  10. 02-Swift学习笔记-元组类型

    02-Swift学习笔记-元组类型 元组类型由N个任意类型的数据组成(N>=0) 元组类型的数据称为"元素" eg var size = (x:100 , y:100) si ...