C++类的内存分配
今天面试被问到一个类的内存问题,有些记不清楚了。用了 C++这么年,实在是不应该。
于是上网查了一些资料,并做了实验,整理如下:
所用测试环境为64位mac air,编译器为XCode
1.最简单
class Test
{
public:
int a ;
};
printf("size=%d\n",sizeof(Test));
这个相信大家都能猜得到。答案是4.这个不解释。
值得一提的是,
Test t;
printf("%d,%d",&t,&(t.a));
t,和t.a的地址是一样的
2.加上成员函数
class Test
{
public:
int a ;
int tt(){return ;}
};
这个可能有些难度 。有人猜是4,有人猜是8,或者其它。
这个仍然是4,原因是成员函数并不属于类(或者说对象),所有的成员函数和全局函数等,都在代码段。所以在调用成员函数时,会隐式的传个this过去,这个this作用其实就是将对象内所有成员变量传递进去。
关于这一点,读过《Lua程序设计》的“面向对象”一章的同学,可能会有更深刻的体会。
3.static
class Test
{
public:
int a ;
static int b ; int tt(){return ;}
};
结果仍然是4,static 变量不占用内存??
不是的,static 变量存放在静态区,并不和普通成员变量在一个区域,所以仍然是4.
4.增加virtual
class Test
{
public:
int a ;
virtual int tt(){return ;}
};
增加一个virtual ,会增加一个虚函数表指针(即使有多个虚函数,也仅有一个虚函数表)
一个有趣的问题是,一个指针占用多少个字节,是4 个字节 吗?
不是的,其实和机器字长有关,在32位机器上是4字节,如果在64位机器上,则是8个字节 。
所以在我的编译环境下,这个的答案应该是12
5.继承的情况
继承的情况下,子类的字节数就是父类加子类.
但需要注意的一点是,子类只有一份虚函数表指针,指向的表中是父类虚函数加子类虚函数
C++类的内存分配的更多相关文章
- 关于c++类的内存分配
参考:这里 虽然有些地方错了,但是也可以一看,大概能加深对c++类相关的内存分配的了解 然后这还不算十分深入,更深入的可以看这里. 这本书是时候读一下了:<深度探索C++对象模型> (待续 ...
- String类的内存分配
首先说一下Java内存分配.物理的内存是线性结构,并不存在拥有不同功能的不同区域,编译器(或者JVM)为了更高效地处理数据,会用不同的算法把内存分为各种区域,不同的区域拥有各自的特性,Java中,内存 ...
- C++ 学习笔记(四)类的内存分配及this指针
类,是使用C++的最主要的内容.如果将c++与C语言做比较,我感觉类更像是结构体的加强进化版.在刚接触C++不久的时候总是让类,对象,this指针弄得一脸懵逼,我对类有比较清楚的认识是从理解类在内存中 ...
- 基类,派生类,内存分配情况 .xml
pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...
- Java“类”的内存分配_case1
- 目录_Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)
1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘 ...
- 【c/c++】内存分配大小
测试平台:linux 32位系统 用sizeof()运算符计算分配空间大小.单位:字节 1. 数组名与变量名的区别 int main() { char q[] = "hello"; ...
- C++ Primer 学习笔记_98_特殊的工具和技术 --优化内存分配
特殊的工具和技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自己主动执行合适的构造函数来初始化每一个动态 ...
- c# 字符串的内存分配和驻留池( 转 )
刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例.如下: string s1 = "he ...
随机推荐
- Spring MVC @Transactional注解方式事务失效的解决办法
在springMVC类上绑定@Transactional的注解,但是访问数据库时,总是报 can't localtion to current JTA Transactional. 后来发现sprin ...
- SonarQube-5.6.3 代码分析平台搭建使用
python代码分析 官网主页: http://docs.sonarqube.org/display/PLUG/Python+Plugin Windows下安装使用: 快速使用: 1.下载jdk ht ...
- SQL Server 查询表备注信息的语句
--name 字段名称--user_type_id --max_length 最大长度--is_nullable 是否允许空--remark 描述SELECT c.name, c.user_ty ...
- Monkeyrunner小脚本关于camera的使用
一下代码涉及自动执行camera,属性一个小设置,恢复初始值,并在中间添加截屏功能 将两个截屏进行前后对比,并返回值 适合初学者,刚刚了解monkeyrunner 的人员来看 注意:一下脚本如果不能执 ...
- HR开发 操作信息类型数据
1.通过函数操作. . DATA: ZRETURN TYPE BAPIRETURN1, ZPAKEY TYPE BAPIPAKEY. GET PERNR. LOOP AT P0001 WHERE .. ...
- python函数动态参数详解
Python的动态参数: 1,参数前一个"*":在函数中会把传的参数转成一个元组. def func (*args): print(args) func(123,1,2,'a') ...
- 一个未解决的samba问题
话说,现在的打复印扫描一体机的扫描功能十分丰富,扫描后的文件可以通过邮件发送,可以发到windows的共享.一直用着windows共享的方式,但是windows系统占用的内存还是略大,想把这个共享放到 ...
- ExtJs知识点概述
1.前言 ExtJS的前身是YUI(Yahoo User Interface).经过不断的发展与改进,ExtJS现在已经成功发布到了ExtJS 6版本,是一套目前最完整和最成熟的javascript基 ...
- ES6-set && 数组剔重
set Set:ES6中提供的新的数据结构set.特点:1.类似数组,属性值时唯一的!!2.Set本身是一个构造函数,用来生成数据结构,表现形式{1,"3",78},是个数据集合 ...
- 一个login
login 1.获取提交表单,保存到变量中.2.判断用户密码是否正确,利用Model类.3.验证用户是否激活.3.判断用户是否记住登录状态,是的话,将其用cookie和session分别保存.没有的话 ...