当前位置: 首页 > 编程日记 > 正文

C++中一个class类对象占用多少内字节(7个例子,很清楚)

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

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

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


    一、空类的Size

 1 class Car
 2 {
 3 };
 4  
 5 void main()
 6 {
 7     int size = 0;
 8     Car objCar;
 9     size = sizeof(objCar);
10     printf("%s %d /r", "Class Car Size:", size);
11 }
输出结果:Class Car Size:1

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

    二、只有成员变量的Size

 1 class Car
 2 {
 3 private:
 4     int nLength;
 5     int nWidth;
 6 };
 7  
 8 void main()
 9 {
10     int size = 0;
11     Car objCar;
12     size = sizeof(objCar);
13     printf("%s %d /r", "Class Car Size:", size);
14 }
输出结果:Class Car Size:8

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

    三、有静态成员变量的Size

 1 class Car
 2 {
 3 private:
 4     int nLength;
 5     int nWidth;
 6     static int sHigh;
 7 };
 8  
 9 void main()
10 {
11     int size = 0;
12     Car objCar;
13     size = sizeof(objCar);
14     printf("%s %d /r", "Class Car Size:", size);
15 }
输出结果:Class Car Size:8

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

    四、有字符型变量(char)的Size

 1 class Car
 2 {
 3 private:
 4     char chLogo
 5     int nLength;
 6     int nWidth;
 7     static int sHigh;
 8 };
 9  
10 void main()
11 {
12     int size = 0;
13     Car objCar;
14     size = sizeof(objCar);
15     printf("%s %d /r", "Class Car Size:", size);
16 }
输出结果:Class Car Size:12

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

    五、只有成员函数的Size

 1 class Car
 2 {
 3 public:
 4     Car(){};
 5     ~Car(){};
 6 public:
 7     void Fun(){};
 8 };
 9  
10 void main()
11 {
12     int size = 0;
13     Car objCar;
14     size = sizeof(objCar);
15     printf("%s %d /r", "Class Car Size:", size);
16 }
输出结果:Class Car Size:1

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

    六、有成员函数和成员变量的Size

 1 class Car
 2 {
 3 public:
 4     Car(){};
 5     ~Car(){};
 6 public:
 7     void Fun(){};
 8 private:
 9     int nLength;
10     int nWidth;
11 };
12  
13 void main()
14 {
15     int size = 0;
16     Car objCar;
17     size = sizeof(objCar);
18     printf("%s %d /r", "Class Car Size:", size);
19 }
输出结果:Class Car Size:8

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

    七、有虚函数(virtual)的Size

 1 class Car
 2 {
 3 public:
 4     Car(){};
 5     virtual ~Car(){};
 6 public:
 7     void Fun(){};
 8 };
 9  
10 void main()
11 {
12     int size = 0;
13     Car objCar;
14     size = sizeof(objCar);
15     printf("%s %d /r", "Class Car Size:", size);
16 }
输出结果:Class Car Size:4

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

http://www.cnblogs.com/findumars/p/7270628.html

转载于:https://www.cnblogs.com/georgeOfChina/p/7661698.html

相关文章:

Java学习----到底调用哪一个方法(多态)

public class Father {public void print() {System.out.println("Father:print()");} } public class Son extends Father{// 方法的覆盖:子类重写父类的同名方法 Overridepublic void print() {System.out.println("Son:print()");}// Father…

mpvue 转uni-app 操作记录

1.创建一个uni-app 的项目,把原有的mpvue项目手动迁移过来 2.用到mpvue特性的代码,需要修改成uni-app 兼容的,例如 mpvue-wxparse 可以修改成 3.src/app.json 改成 pages.json ,路径格式需要改,如下格式 {"pages": [&…

桌面应用程序 azure_Azure Logic应用程序用例–黑色星期五

桌面应用程序 azureThis blog gives an overview of how Azure Serverless technologies came to rescue when the custom-built integration system went down. Also, it shows the high-level architecture solution built using Azure Serverless services like Logic Apps,…

PHP的静态变量介绍

静态变量只存在于函数作用域内,也就是说,静态变量只存活在栈中。一般的函数内变量在函数结束后会释放,比如局部变量,但是静态变量却不会。就是说,下次再调用这个函数的时候,该变量的值会保留下来。 只要在变…

MySQL 解压版创建用户密码

root 权限进入MySQL: mysql –uroot 查看当前MySQL用户: select user,host from mysql.user; 此处以User为root,Host为localhost的账户为例,将密码改为password的命令: SET PASSWORD FOR rootlocalhost PASSWORD(newp…

git 忽略指定文件夹的上传

我们在使用 git 开发的时候,有些插件的模块文件通过npm install 就可以下载,一般是不上传到 git 中的(因为文件太多会导致很耗时),例如 我的 node_modules 文件夹,不想上传,我们应该这么做。 我们需要创建一…

数据库初学者_面向初学者的免费6小时数据科学课程

数据库初学者Data science is considered the "sexiest job of the 21st century." Learn data science in this full 6-hour course for absolute beginners from Barton Poulson of datalab.cc.数据科学被认为是“ 21世纪最艰巨的工作”。 通过datalab.cc的 Barton…

网页抓取及下载

downAndroidApk.php <?php /* 命令行 d: cd ApacheServer\php php.exe D:\ApacheServer\web\crawl\downAndroidApk.php --appidFileD:\ApacheServer\web\crawl\youxi.txt --newDirD:\ApacheServer\web\crawl\requestNewDir*/ // 判断必须在php-cli模式下运行&#xff0c;即…

javascript中关于this指向问题详解

前 言 LiuDaP 在前端的学习中&#xff0c;我们必然要用到js&#xff0c;js可以说是前端必不可少的的东西。在学习js的过程中&#xff0c;我们会经常用到this这个东西&#xff0c;而this的指向问题就变得尤为重要。今天正好有空闲时间&#xff0c;就给大家详细介绍一下js中关于…

mpvue 转uniapp 导航栏样式错乱问题修复 tabbar 样式修复

效果图&#xff1a;修改前&#xff0c;修改后 找了半天没找到原因&#xff0c;只能自己改样式了&#xff0c;下面是样式代码&#xff08;在app.vue 里面加上就行&#xff09; <style>/*每个页面公共css */uni-tabbar {box-sizing: border-box;position: fixed;left: 0;bo…

css规则_CSS规则,将使您的生活更轻松

css规则by Nick Gard尼克加德(Nick Gard) CSS规则&#xff0c;将使您的生活更轻松 (CSS rules that will make your life easier) After years of writing and maintaining a couple of very large web projects and numerous smaller ones, I have developed some heuristics…

在mybatis中模糊查询有三种写法

<select id"selectStudentsByName" resultType"Student"> <!--第一种--> <!-- select id,name,age,score from student where name like % #{0} % --> <!--第二种--> <!-- select id,name,age,score from student wher…

BZOJ 3566: [SHOI2014]概率充电器

题目&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id3566 首先这题正着想不好想&#xff0c;考虑补集转化。 先dfs一遍&#xff0c;令f[u](1-p[u])*∏(1-(1-f[v])*w) f[u]表示u这个点通过其子树并不能联通的概率。 然后考虑v从其父亲连过来的情况&#xff0c;设…

小程序云开发,订阅消息定时批量发送实现代码

需求&#xff1a;做一个类似抽奖结果通知的订阅消息提醒 实现流程&#xff1a; 每个用户需要先授权订阅消息接收&#xff0c;授权成功后把数据存到云开发的数据集合里面&#xff0c;再写个定时器&#xff0c;遍历数据集合的所有数据&#xff0c;拿到后遍历发送订阅消息&#…

机器学习速成课程

Learn the basics of machine learning and data science in this crash course tutorial for beginners from AI Sciences Academy. This course will give you the foundation you need to start learning more advanced material.在此速成课程教程中为AI Sciences Academy的…

H5 画布解决跨域问题,画布保存为图片显示在页面上

实现功能&#xff1a;uniapp H5 使用画布&#xff0c;绘画完之后保存为图片全屏显示完整实现代码&#xff0c;跨域解决方案。 跨域图片解决方案一&#xff1a;&#xff08;使用base64编码&#xff09;网络图片放到画布里面绘画 跨域图片解决方案二&#xff1a;&#xff08;使…

1、IO输入输出流 简介

IO流的分类&#xff1a; * 流向&#xff1a; * 输入流 读取数据 * 输出流 写出数据 * 数据类型&#xff1a; * 字节流 * 字节输入流 读取数据 InputStream * 字节输出流 写出数据 OutputStream * 字符流 * 字符输入流 读取数据 Reader * 字符输出流 写出数据 Writer * * 注意&…

mern技术栈好处?_通过构建运动追踪器应用程序来学习MERN堆栈(MERN教程)

mern技术栈好处?The MERN stack is a popular stack of technologies for building a modern single-page application. In this video course I developed, you will learn the MERN stack by building a full stack exercise tracker application.MERN堆栈是用于构建现代单页…

使用html5进行视频播放

一直以来网页大多是使用 flash 来播放视频。在目前唱衰 flash 的环境下&#xff0c;HTML5 为我们带来了一个网页内视频播放的解决方案—— <video>标签。 在HTML5 中&#xff0c;可以通过HTML标签“audio”和“video”来支持嵌入式的媒体&#xff0c;使开发者能够方便地将…

Linux学习之系统时间同步

一、系统时间的设置 在Linux中设置系统时间&#xff0c;可以用date命令&#xff1a; 1 //查看时间 2 [rootlocalhost ~]# date 3 2008年 12月 12日 星期五 14:44:12 CST 4 //修改时间 5 [rootlocalhost ~]# date --set "1/1/09 00:01" < &#xff08;月/日/年时:分…

uniapp(一) 项目架构,封装

前言&#xff1a; 最近需要搭建一套基于uniapp 的代码模板&#xff0c;适应各平台的快速打包部署&#xff0c;为提高代码复用率&#xff0c;提升生产力&#xff0c;所以需要构建一套优雅的前端项目架构&#xff0c;下面分享记录一下我的封装。 代码封装我暂时分为三个层面&…

linux下安装sbt_如何在Linux上安装SBT

linux下安装sbt介绍 (Introduction) Hi! I am Sanjula, and in this guide I hope to teach you how to install sbt on Linux.嗨&#xff01; 我是Sanjula &#xff0c;我希望在本指南中教您如何在Linux上安装sbt。 Let’s get started!让我们开始吧&#xff01; 什么是sbt&…

switch...case结构

/**switch(要判断的数据){ case 值1: ...;break; case 值2: ...;break; case 值3: ...;break; default: ...;break;}*/ publuc class employee{ int id; // 员工id String name; // 员工名字 int age; // 员工年龄 String phone; // 员工号码 String address; // 员工地址 publ…

自动布局的 弊端 (后续)

自动布局 比 直接写 frame 会慢很多 具体以后再说吧转载于:https://www.cnblogs.com/Ionatan/p/5109211.html

uniapp H5 JSSDK封装使用

先看效果吧, 封装以后使用很方便,两行代码就能得到微信网页开发中的 jssdk 的 wx.config 执行了 wx.ready 还是 wx.error ,如果返回 true 就标识执行了ready , 可以调用JSSDK的 API 了,如下图示例代码: this.$common.Init.call(this); this.wxjssdkInti().then(rr =>…

课程表美化 css_通过这门11小时的免费课程学习HTML和CSS

课程表美化 cssHTML and CSS are essential skills to have for a career in web development. This eleven hour course from John Smilga of Coding Addict will teach HTML and CSS from the scratch. By the end of this course you will be creating your own projects.HT…

JavaScript创建对象的两种方法和遍历对象的属性

创建新对象有两种不同的方法&#xff1a; 定义并创建对象的实例使用函数来定义对象&#xff0c;然后创建新的对象实例1.定义并创建对象的实例 var personnew Object(); person.firstname"John"; person.lastname"Doe"; person.age50; person.eyecolor"…

微信公众号H5订阅消息开发 uniapp订阅消息

简单说一下流程&#xff1a; 在页面带参数跳转到 https://mp.weixin.qq.com/mp/subscribemsg &#xff0c;然后用户授权确认或者取消以后&#xff0c;会返回参数里面 redirect_url 的地址&#xff0c;并且带上openid 等相应参数&#xff0c;在前端的页面判断链接里面携带了相关…

GRUB密码设置

通过编辑GRUB启动参数可以轻松的进入单用户模式从而修改root密码&#xff0c;GRUB的密码设置可分为全局密码和菜单密码。 一&#xff0c;全局密码设置 在splashimage这个参数的下一行可以加上password密码&#xff0c;保存后重新启动计算机&#xff0c;再次登录到GRUB菜单页…

国内使用dropbox_通过创建费用管理器来学习使用Dropbox API

国内使用dropboxLearn how to build an expense organizer with the Dropbox API and JavaScript ES6! 了解如何使用Dropbox API和JavaScript ES6构建费用管理器&#xff01; Dropbox is a content and collaboration platform. Its API allows you to add Dropbox features t…