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. POJ 2142 The balance | EXGCD

    题目: 求ax+by=c的一组解,使得abs(x)+abs(y)尽量小,满足前面前提下abs(ax)+abs(by)尽量小 题解: exgcd之后,分别求出让x尽量小和y尽量小的解,取min即可 #i ...

  2. hdu 1142 最短路+记忆化

    最短路+记忆化搜索HDU 1142 A Walk Through the Forest链接:http://acm.hdu.edu.cn/showproblem.php?pid=1142 > 题意 ...

  3. jstl标签forEach的用法--遍历java的集合

    再讲<c:forEach>之前,现讲一下让EL表达式生效的语句 <% @ page isELIgnored="false"%>这句语句在你想让EL表达式生效 ...

  4. spring in action 学习笔记十四:用纯注解的方式实现spring mvc

    在讲用纯注解的方式实现springmvc之前先介绍一个类:AbstractAnnotationDispatcherServletInitializer.这个类的作用是:任何一个类继承AbstractA ...

  5. 用Sublime搭建Python开发环境(windows)

    1.安装Python 3 去官网下载Python 3,网址:https://www.python.org/downloads/release/python-363/ 双击安装,勾选添加到环境变量. 有 ...

  6. Java笔记(一)

    1. ConcurrentModificationException 在遍历容器的同时修改容器里的成员对象可能会抛出该异常 http://www.blogjava.net/EvanLiu/archiv ...

  7. 结构型设计模式之装饰模式(Decorator)

    结构 意图 动态地给一个对象添加一些额外的职责.就增加功能来说,D e c o r a t o r 模式相比生成子类更为灵活. 适用性 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. ...

  8. aiohttp的学习

    https://hubertroy.gitbooks.io/aiohttp-chinese-documentation/content/aiohttp%E6%96%87%E6%A1%A3/Client ...

  9. HTML添加上传图片并进行预览

    使用说明:新建文件,直接复制粘贴,保存文件为html 格式,在浏览器运行即可: 第一种: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Tr ...

  10. ros move_base costmap 理解和实现动态窗口法避障

    以下大部分内容参考自 ros_by_example_hydro_volume_1.pdf local costmap 是怎么生成的?跟三维点云有什么关系? global costmap在没有全局地图下 ...