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 ...
随机推荐
- 再探 KMP 算法
$\DeclareMathOperator{\fail}{fail}$ KMP 算法堪称经典中的经典,然而这么多年以来,我却未能完全理解这个算法.我对 KMP 算法掌握的程度,是知其原理,但写不出来. ...
- [poj] 3068 "Shortest" pair of paths || 最小费用最大流
[原题](http://poj.org/problem?id=3068) 给一个有向带权图,求两条从0-N-1的路径,使它们没有公共点且边权和最小 . //是不是像传纸条啊- 是否可行只要判断最后最大 ...
- vue的过渡效果
https://segmentfault.com/a/1190000007738518
- spring in action 学习笔记六:bean在不同情况下的默认id号或者将名字
bean如果不知名id是什么它一般都有一个id或者讲名字. 第一种情况:组件扫描的情况:默认的id号或者bean的name是类名的首字母小写. 代码如下: package com.qls.beanli ...
- 手动编写一个简单的loadrunner脚本
loadrunner除了自动录制脚本外,还可以手动编写脚本,通过右键+inset step添加步骤,还可以手动添加事务,集合点等 下面是一个简单的Action脚本,服务是运行在本机的flask服务: ...
- 从零开始--Spring项目整合(1)使用maven框架搭建项目
这些年一直在用spring的框架搭建项目,现在开始我们从零开始利用Spring框架来搭建项目,目前我能想到有Spring.SpringMVC.SpringJDBC.Mybatis.WebSockt.R ...
- [ CodeVS冲杯之路 ] P1011
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1011/ 一开始以为是道数学题,列出了一个公式 后面验证,发现只能推出第一次,后面的还需要迭代,推翻这个公式 又去瞟了一 ...
- YYH的积木(NOIP模拟赛Round 6)
题目描述 YYH手上有n盒积木,每个积木有个重量.现在他想从每盒积木中拿一块积木,放在一起,这一堆积木的重量为每块积木的重量和.现在他想知道重量最少的k种取法的重量分别是多少. 输入输出格式 输入格式 ...
- QT5.3 杂记(转)
原文转自 https://www.cnblogs.com/aoldman/p/3968280.html Qt5下,QWidget系列从QtGui中被剥离出去,成为单独的QtWidget模块.随着Qt ...
- dnspod 批量添加记录
#!/usr/bin/python #-*- coding: utf-8 -*- import os,requests,json import re,xlsxwriter,time import xl ...