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. IPv6的一些特殊地址

    IPv6的一些特殊地址   2008年7月3日第二次修正! 昨天是修正了地址部分,本想发上来的,没来得及.今天修正了NDP协议,接下来会是路由和转换部分. 总结一下各协议的精华:OSPF在于LSA,B ...

  2. 利用VS2013 XSLT对 XML进行转换

    1.打开VS2013 2.文件-->新建-->文件-->XML文件 3.文件-->新建-->文件-->XSLT文件 4.CTRL+SHIFT+S 保存2个文件位置 ...

  3. [luogu4242] 树上的毒瘤

    题目描述 这棵树上有n个节点,由n−1条树枝相连.初始时树上都挂了一个毒瘤,颜色为ci.接下来Salamander将会进行q个操作. Salamander有时会修改树上某个点到另外一个点的简单路径上所 ...

  4. JZOJ 5305 C先生

    题意: 有一个n个点,m条边的图,没有重边.自环,且每一条边最多属于一个环路. 给出q组询问,每次询问u,v两点间的路径有多少种可能. 思路: 先看下方样例说明: 由样例说明可以得知,路径上每经过一个 ...

  5. 纯css美化复选框,单选框,滑动条(range)

    <div class="box"> <!-- 借鉴地址:http://www.cnblogs.com/xiaoxianweb/p/5465607.html --& ...

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

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

  7. java算法(二) 快速排序

    快速排序是一种交换排序. 快速排序由C. A. R. Hoare在1962年提出. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数. 然后再 ...

  8. noi2017 T1 整数 ——线段树

    loj.ac上有  题目传送门 不过我还是把题目搬过来吧 整数(integer)[题目背景]在人类智慧的山巅,有着一台字长为 1048576 位的超级计算机,著名理论计算机科 学家 P 博士正用它进行 ...

  9. python xpath 基本用法

    转自:http://www.pythoner.cn/home/blog/python-xpath-basic-usage/ Pyer发现 业界资讯 相册 第7期:Pythoner技术交流沙龙 关于我们 ...

  10. MFC中CTime获取日期时间的方法

    MFC中CTime类的功能非常强大,可以获取年.月.日.小时.分钟.秒.星期等等,最最重要的是可根据需要去格式化.下面是具体的使用方式: ① 定义一个CTime类对象 CTime time; ② 得到 ...