1.空类所占字节数为1,可见代码如下

#include <iostream>
using namespace std; class Parent
{ }; class Child:public Parent
{
public:
int b ;
}; int main(int argc, char* argv[])
{
Child b;
Parent a; cout << "a.sizeof = " << sizeof(a) << endl;
cout << "b.sizeof = " << sizeof(b) << endl; system("pause");
return ;
}

打印结果为:

  

分析:

  为了能够区分不同的对象,一个空类在内存中只占一个字节;

  在子类继承父类后,如果子类仍然是空类,则子类也在内存中指针一个字节;

           如果子类不是空类,则按照成员变量所占字节大小计算。

2.类中的成员函数不占内存空间,虚函数除外;

#include <iostream>
using namespace std; class Parent
{
public:
void func() {};
void func1() { int a; };
void func2() { int b; };
}; class Child:public Parent
{
public:
int b ;
}; int main(int argc, char* argv[])
{
Child b;
Parent a; cout << "a.sizeof = " << sizeof(a) << endl;
cout << "b.sizeof = " << sizeof(b) << endl; system("pause");
return ;
}

输出结果如下:

  

分析:上述代码中父类,在内存中仍然只占有一个字节;原因就是因为函数在内存中不占字节;

   但是,如果父类中如果有一个虚函数,则类所字节发生变化,如果是32位编译器,则占内存四个字节;

#include <iostream>
using namespace std; class Parent
{
public:
virtual void func() {};
virtual void func1() { int a; };
void func2() { int b; };
}; class Child:public Parent
{
public:
int b ;
}; int main(int argc, char* argv[])
{
Child b;
Parent a; cout << "a.sizeof = " << sizeof(a) << endl;
cout << "b.sizeof = " << sizeof(b) << endl; system("pause");
return ;
}

输出结果:

  

分析:

  通过上述代码可见,编译器为32时,无论几个虚函数所占的字节数都为4;

  而子类在内存中占的字节数为父类所占字节数+自身成员所占的字节数;

3.和结构体一样,类中自身带有四字节对齐功能

#include <iostream>
using namespace std; class Parent
{
public:
char a;
virtual void func() {};
virtual void func1() { int a; };
void func2() { int b; };
}; class Child:public Parent
{
public:
char c;
int b ;
}; int main(int argc, char* argv[])
{
Child b;
Parent a; cout << "a.sizeof = " << sizeof(a) << endl;
cout << "b.sizeof = " << sizeof(b) << endl; system("pause");
return ;
}

输出结果:

  

分析:

  Parent类中,char a;占一个字节,虚函数占有四个字节,由于类的字节对齐,所以总共父类占有8个字节;

  子类中,char c 占有一个字节,int 占四个字节,由于字节对齐,本身共占有8字节,再加上父类的8字节,共占有16字节;

4.类中的static静态成员变量不占内存,静态成员变量存储在静态区

#include <iostream>
using namespace std; class G
{
public:
static int a;
}; int main(int argc, char * argv[])
{ cout << sizeof(G)<<endl; system("pause");
return ; }

结果输出:

  

总结:

  1.空类必须占一个字节;

  2.非虚函数指针不占字节;

  3.虚函数根据编译器位数,占相应字节,不论虚函数个数,只占一个虚函数的字节;

  4.类具有4字节对齐功能;

  5.类中的静态成员变量不占类的内存;并且静态成员变量的初始化必须在类外初始化;

C++之类成员所占内存大小问题总结的更多相关文章

  1. C++类所占内存大小计算

    C++类所占内存大小计算 说明:笔者的操作系统是32位的. class A {}; sizeof( A ) = ? sizeof( A ) = 1明明是空类,为什么编译器说它是1呢? 空类同样可以实例 ...

  2. YUV和RGB格式单像素所占内存大小分析

    图片的大小定 义为:w * h,宽高分别为w和h 一.YUV格式 1.1.YUV420格式存储方式:先Y,后V,中间是U.其中的Y是w * h,U和V是w/2 * (h/2)举例:如果w = 4,h ...

  3. 4种方法教你如何查看java对象所占内存大小

    摘要:本文讲述4种查看java对象所占内存大小的方法 本文分享自华为云社区<查看java对象所占内存大小>,作者:xiewenci. 计算java对象所占内存大小 1.使用jdk8自带AP ...

  4. sizeof strlen strncpy用法总结 结构体实际所占内存大小 以及memset用法

    sizeof测类型(数组名除外) strlen测实际长度 strncpy返回指针类型 #include <stdio.h> #include <stdlib.h> #inclu ...

  5. JAVA数组所占内存大小的对比

    1.两个数据模型 第一个是基本类型数组,第二个使用的是Float对象数组 public class SummaryModel{ private float[] summaryData; public ...

  6. 如何获取一个Java对象所占内存大小

    新建一个maven工程 我们先在IDEA中新建一个名为ObjectSizeFetcherAgent的maven工程,如下图: 在maven项目中的pom.xml中新增一个打jar包的插件,如下: &l ...

  7. [C++关键字] alignof & alignas 内存对齐 sizeof 占内存大小

    直接上代码测试是入门神器,以结构体为例,解释“对齐”和“补齐”概念. #include <iostream> struct Empty {}; struct Foo { int f2; d ...

  8. 复杂Java对象所占内存的大小

    我们在Java单个对象内存布局中讲解了单个简单的Java对象所占内存的大小的计算.那么这篇文章主要是讲解复杂Java对象所占内存大小的计算,我们把继承.复合的对象称为复杂对象 继承对象 class P ...

  9. C++中类所占的内存大小以及成员函数的存储位置

    类所占内存的大小是由成员变量(静态变量除外)决定的,虚函数指针和虚基类指针也属于数据部分,成员函数是不计算在内的.因为在编译器处理后,成员变量和成员函数是分离的.成员函数还是以一般的函数一样的存在.a ...

随机推荐

  1. [bzoj4712] 洪水 [树链剖分+线段树+dp]

    题面 传送门 思路 DP方程 首先,这题如果没有修改操作就是sb题,dp方程如下 $dp[u]=max(v[u],max(dp[v]))$,其中$v$是$u$的儿子 我们令$g[u]=max(dp[v ...

  2. 更改Debian的console分辨率

    1.通过apt-get install hwinfo来安装 2.通过命令hwinfo --framebuffer来获取 eric@debian:~$ sudo sudo hwinfo --frameb ...

  3. 【转】shell脚本写的俄罗斯方块游戏

    亲测一个很好玩的shell脚本写的俄罗斯方块游戏,脚本来自互联网 先来讲一下思维流程 一.方块的表示 由于shell不能定义二维数组,所以只能用一维数组表示方块,俄罗斯方块主要可以分为7类,每一类方块 ...

  4. ajax+json模态框中分页(spring+struts+mybatis+easyui分页插件)

    0.业务需求: 点击每个数字的时候可以显示每个对应的详细记录.也就是得点击11的时候拿着开采部与C级去查询.

  5. jQuery选择器总结(重要)

    jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个 ...

  6. Windows ToolTips简要介绍(转)

    原文转自 https://blog.csdn.net/sesiria/article/details/77450151 Windows 标准控件ToolTips简要介绍 参考文档 MSDN https ...

  7. 戴文的Linux内核专题:03 驱动程序【转】

    转自:http://www.lai18.com/content/432194.html 驱动程序是使内核能够沟通和操作硬件或协议(规则和标准)的小程序.没有驱动程序,内核不知道如何与硬件沟通或者处理协 ...

  8. UVA 10079 Pizze Cutting

    题意:N条直线最多把平面分成几个部分 ans=1+(N+1)*N/2; 直线数量 1 2 3 4 …………n把平面分成的块数 2 4 7 11 1+1 1+1+2 1+1+2+3 1+1+2+3+4 ...

  9. 配置Nginx来支持php

    安装php7     下载地址:https://secure.php.net/downloads.php这里下载的是:wget http://ar2.php.net/distributions/php ...

  10. java基础练习 12

    public class Twelfth { /*海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成五 ...