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 ...
随机推荐
- videoconverter转换
以前录制的avi用vfw可以解码的,但是现在变成win7系统了,无法解码了.只好用视频转换软件把avi转成无压缩的. 选择losses uncompressed avi,点进去选UYVY就行了.
- Android发送短信核心代码
核心代码:(1)SmsManager manager = SmsManager.getDefault(); //获得默认的消息管理器(2)ArrayList<String> list = ...
- [刘阳Java]_MyBatis_常规标签的用法_第6讲
一般MyBatis最基本标签,或者说初学者上手最快的标签就是增删改查 1.<insert>标签,在MyBatis中完成数据添加操作 <insert id="addMyUse ...
- C# 去除字符串首尾字符或字符串
在做一个属性入库的功能,将Excel属性数据导入到图层要素当中,这里Excel和SDE数据库数据存在一个关联字段,通过关联字段值进行匹配属性入库. 在实际业务中,由于普查数据往 ...
- Fatal error in launcher: Unable to create process using '"'
今天遇到了 Fatal error in launcher: Unable to create process using '"' 这个问题,原来是我上次装python3.5的时候,pyth ...
- Java实现中文数字转换为阿拉伯数字
/** * 中文數字转阿拉伯数组[十万九千零六十 --> 109060] * @author 雪见烟寒 * @param chineseNumber * @return */ @Suppress ...
- Linux基本权限学习
概念 权限就是用户对资源所能进行的操作 -- 这里涉及到三个重要的概念:用户.资源.操作. 首先,Linux中用户分为:u.g.o,就是用户.用户组.其他用户.--这里的用户是指拥有者!!!务必记住! ...
- javascript学习第五课this、call、apply
js函数与其它 高级语言相比有一个特点.没有返回值,一个简单函数就是function关键字+函数名字构成 this 对象是在运行中基于函数的执行环境绑定的,在全局函数中,this等于window,而当 ...
- css+js定位到屏幕中间
ex:让一个div始终显示在屏幕中间 一. css:#idName{position: absolute;z-index: 999;width: ?px;margin-top: ?px;}//此处的初 ...
- DBNull 与 求和方法
public int CountMoney() { if (!DBNull.Value.Equals(Eval("LawyerMoney")) && !DBNull ...