C++之类成员所占内存大小问题总结
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++之类成员所占内存大小问题总结的更多相关文章
- C++类所占内存大小计算
C++类所占内存大小计算 说明:笔者的操作系统是32位的. class A {}; sizeof( A ) = ? sizeof( A ) = 1明明是空类,为什么编译器说它是1呢? 空类同样可以实例 ...
- 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 ...
- 4种方法教你如何查看java对象所占内存大小
摘要:本文讲述4种查看java对象所占内存大小的方法 本文分享自华为云社区<查看java对象所占内存大小>,作者:xiewenci. 计算java对象所占内存大小 1.使用jdk8自带AP ...
- sizeof strlen strncpy用法总结 结构体实际所占内存大小 以及memset用法
sizeof测类型(数组名除外) strlen测实际长度 strncpy返回指针类型 #include <stdio.h> #include <stdlib.h> #inclu ...
- JAVA数组所占内存大小的对比
1.两个数据模型 第一个是基本类型数组,第二个使用的是Float对象数组 public class SummaryModel{ private float[] summaryData; public ...
- 如何获取一个Java对象所占内存大小
新建一个maven工程 我们先在IDEA中新建一个名为ObjectSizeFetcherAgent的maven工程,如下图: 在maven项目中的pom.xml中新增一个打jar包的插件,如下: &l ...
- [C++关键字] alignof & alignas 内存对齐 sizeof 占内存大小
直接上代码测试是入门神器,以结构体为例,解释“对齐”和“补齐”概念. #include <iostream> struct Empty {}; struct Foo { int f2; d ...
- 复杂Java对象所占内存的大小
我们在Java单个对象内存布局中讲解了单个简单的Java对象所占内存的大小的计算.那么这篇文章主要是讲解复杂Java对象所占内存大小的计算,我们把继承.复合的对象称为复杂对象 继承对象 class P ...
- C++中类所占的内存大小以及成员函数的存储位置
类所占内存的大小是由成员变量(静态变量除外)决定的,虚函数指针和虚基类指针也属于数据部分,成员函数是不计算在内的.因为在编译器处理后,成员变量和成员函数是分离的.成员函数还是以一般的函数一样的存在.a ...
随机推荐
- hdu 1007 Quoit Design (最近点对问题)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- registry --------->仓库 ----------------->镜像
registry --------->仓库 ----------------->镜像 本地镜像都保存在宿主机下 : /var/lib/docker/containers 镜像从仓库下载下来 ...
- BZOJ3609 [Heoi2014]人人尽说江南好 【博弈】
题目链接 BZOJ3609 题解 我们假设最后合成若干个\(m\),和\(n \mod m\),此时合成次数是最多的,也唯一确定胜利者 可以发现,在轮流操作的情况下,胜利者一定可以将终态变为这个状态 ...
- latex公式测试
https://katex.org/docs/supported.html 1.x_n $x_n$ 2 . \sum $\sum$ \sum_{i=1}^n $\sum_{i=1}^n $ 3.\bi ...
- HTML标签的使用要注意语义化
语义化标签:你认为用什么标签最能描述这块内容,觉得这样表述更有意义,那么就可以使用这个标签. 现在的浏览器对CSS支持都挺完善的(不包括CSS3),讲究的是结构与表现相分离,结构与行为相分离,一个WE ...
- 3.2 Lucene实战:一个简单的小程序
在讲解Lucene索引和检索的原理之前,我们先来实战Lucene:一个简单的小程序! 一.索引小程序 首先,new一个java project,名字叫做LuceneIndex. 然后,在project ...
- RDM原始设备映射
在一个存储区域网络(SAN)上,有两种方法为虚拟机配置存储.一种方法是使用VMFS,这是VMware Infrastructure(VI)提供的专有高性能集群文件系统.对大多数企业应用来说,在VMFS ...
- VMware HA 特性
关键特性1.自动检测服务器故障.VMware HA 自动监控物理服务器的可用性.VMware HA 可检测物理服务器故障,并且无需人工干预即可重新启动资源池中其他物理服务器上的新虚拟机.2.自动检测操 ...
- xCode中去除“Implicit declaration of function 'sysctl' is invalid in C99” 警告
http://blog.csdn.net/dreambegin/article/details/8609121 一般出现该问题是因为通过C调用了unix/linux 底层接口,所以需要调整c语言的编译 ...
- HDU5469 Antonidas(树分治&&哈希)
给你一颗点上有字符的树,问一个给定的字符串是否是这棵树上的两点的路径. 树分治的思想就是每次找重心,重心下的子问题分解去做,然后就是合并了.合并的时候用一个总的set<pair<len,h ...