转载博客:转载地址https://www.cnblogs.com/JingHuanXiao/p/6080726.html

一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分?

一个Class对象需要占用多大的内存空间。最权威的结论是: 
    *非静态成员变量总合。 
    *加上编译器为了CPU计算,作出的数据对齐处理。 
    *加上为了支持虚函数,产生的额外负担。

介绍完了理论知识后,再看看再找一个例子看看(注:一下所有结果都是在VC6.0 开发环境中得出的结论) 
一、空类的Size

 class Car
{
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
} 输出结果:Class Car Size:

这是为何呢?我想对于这个问题,不仅是刚入行不久的开发新手,就算有过几年以上C++开发经验的开发人员也未必能说清楚这个。 
编译器在执行Car objCar;这行代码后需要,作出一个Class Car的Object。并且这个Object的地址还是独一无二的,于是编译器就会给空类创建一个隐含的一个字节的空间。

二、只有成员变量的Size

 class Car
{
private:
int nLength;
int nWidth;
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
} 输出结果:Class Car Size:

这个结果很多开发人员都清楚。在32位系统中,整型变量占4个字节。这里Class Car中含有两个整型类型的成员变量,所以Class Size是8。

 class Car
{
private:
int nLength;
int nWidth;
static int sHigh;
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:

我们这次在Class Car中添加了一个静态成员变量,但是Class Size仍然是8个字节。这正好符合了,结论中的第一条:非静态成员变量总合。

 class Car
{
private:
char chLogo
int nLength;
int nWidth;
static int sHigh;
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:

在类中又插入了一个字符型变量,结果Class Size变成了12。这个就是编译器额外添加3个字符变量,做数据对齐处理,为了是提高CPU的计算速度。编译器额外添加的东西我们是无法看见的。这也符合了结论中的第二条:加上编译器为了CPU计算,作出的数据对齐处理。 
既然,我们这样定义类成员数据编译器会额外的增加空。那么,我们何不在定义类的时候就考虑到数据对齐的问题,可以多定义出3个字符类型变量作为预留变量,既能满足数据对齐的要求,也给自己的程序添加了一些可扩展的空间。

三、只有成员函数的Size

 class Car
{
public:
Car(){};
~Car(){};
public:
void Fun(){};
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:

噢,这是怎么回事儿呢?再做一个实验看看。

 class Car
{
public:
Car(){};
~Car(){};
public:
void Fun(){};
private:
int nLength;
int nWidth;
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:

这次应该很清楚的了。函数是不占用类空间的。第一个例子中的Size为1个字节,正是编译器为类创建一个隐含的一个字节的空间

 class Car
{
public:
Car(){};
virtual ~Car(){};
public:
void Fun(){};
}; void main()
{
int size = ;
Car objCar;
size = sizeof(objCar);
printf("%s %d /r", "Class Car Size:", size);
}
输出结果:Class Car Size:

这次,让析构函数为虚函数,看到了Class Size为4。这正是指向Virtual Table的指针vptr的Size。这正好符合了,结论中的第三条:加上为了支持虚函数,产生的额外负担。

c++ 中一个类或者一个对象所占的字节数的更多相关文章

  1. Java单例设计模式(实现Java的一个类只有一个对象)

    单例设计模式的定义:单例设计模式是一种软件设计模式,在它的核心包含一个称为单例类的核心类. 核心便是希望一个类只有一个对象.  如何实现类在内存中只有一个对象呢? 第一步:构造私有:第二步:本身提供一 ...

  2. TypeToken 是google提供的一个解析Json数据的类库中一个类

    Type listType = new TypeToken<LinkedList<User>>(){}.getType(); Type是java里的reflect包的Type ...

  3. Android中一个类实现的接口数不能超过七个

    近期一段时间,在开发Android应用程序的过程中,发现Android中一个类实现的接口数超过七个的时候,常常会出现超过第7个之后的接口不能正常使用.

  4. 在C语言中基本数据类型所占的字节数

    基本数据类型所占的字节数其实跟C语言本身没有太大的关系,它取决于编译器的位数,下面这张表说明了不同编译器下基本数据类型的长度: 32位编译器中各基本类型所占字节数: 注:对于32位的编译器,指针变量的 ...

  5. Java中文字符所占的字节数

    Java语言中,中文字符所占的字节数取决于字符的编码方式,一般情况下,采用ISO8859-1编码方式时,一个中文字符与一个英文字符一样只占1个字节:采用GB2312或GBK编码方式时,一个中文字符占2 ...

  6. php中int类型在不同平台所占不同字节数理解

    1.在不同平台上占字节数与最大值 在32位平台上int占4个字节,在64位平台上int占8个字节,PHP_INT_SIZE 在32位平台上int的最大值2^31 - 1,在64位平台上int最大值2^ ...

  7. 字节数与字符数mysql_mysql里一个中文汉字占多少字节数?

    在mysql中,如果是latin1字符集下,一个中文汉字占2个字节数:如果是utf8字符集下,一个中文汉字占3个字节数:如果是gbk字符集下,一个中文汉字占2个字节数. mysql各字符集下汉字和字母 ...

  8. java中 int、char、long各占多少字节数

    所谓的占用字节数 就是申请内存的时候所占的空间大小 byte    1字节 最小值是 -128(-2^7):    最大值是 127(2^7-1): boolean    至少1字节 这种类型只作为一 ...

  9. int、char、long各占多少字节数

    Java基本类型占用的字节数:1字节: byte , boolean2字节: short , char4字节: int , float8字节: long , double 编码与中文:Unicode/ ...

随机推荐

  1. MySQL详细操作

    一.用户管理 -- 创建用户 create user "用户名"@"IP地址" identified by "密码"; "; &q ...

  2. 2.使用term filter搜索数据

    主要知识点 根据用户ID.是否隐藏.帖子ID.发帖日期来搜索帖子 一.准备数据 1.插入一些测试帖子数据     POST /forum/article/_bulk { "index&quo ...

  3. BZOJ 1641 USACO 2007 Nov. Cow Hurdles 奶牛跨栏

    [题解] 弗洛伊德.更新距离的时候把$f[i][j]=min(f[i][j],f[i][k]+f[k][j])$改为$f[i][j]=min(f[i][j],max(f[i][k],f[k][j])) ...

  4. Maven学习总结(2)——Maven项目构建过程练习

    Maven学习总结(二)--Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建 ...

  5. poj 1698

    题意:爱丽丝喜欢拍电影,现在正好有N个公司找她拍电影,每部电影都指定在每周的星期几拍,要用D天拍完电影,最迟M个星期要拍完.问爱丽丝能不能拍完所有电影. 分析:350天各为一个顶点,每个顶点都有且只有 ...

  6. Jmeter 学习imooc

    https://www.imooc.com/video/14718 1. BS Vs CS BS架构: browser server CS架构: Client server(安装到本地)

  7. Spring MVC REST 风格的 URL

    前言 本文主要内容为 REST 风格的 URL. REST REST(Representational State Transfer).(资源)表现层状态转化.它是一种架构风格,用 url 来访问网络 ...

  8. N天学习一个linux命令之vmstat

    用途 查看系统资源整体使用情况,包括进程数量,CPU,内存,IO,swap等资源统计信息 用法 vmstat [options] [delay [ count]] 常用选项 -a 显示active/i ...

  9. HDU 4516

    此题不难,但我就是RE,搞不懂啊...郁闷. 说下基本算法吧,只要留意到要分解的因式是(x+ai)..的形式,x前是系数为1的,而且,它们的绝对值在1000以内,于是,好办了.只要枚举(x+k)中的k ...

  10. NGINX Web Server Nginx web server

    原文地址:http://nginx.com/resources/admin-guide/web-server/ NGINX Web Server Nginx web server This secti ...