今天面试被问到一个类的内存问题,有些记不清楚了。用了 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++类的内存分配的更多相关文章

  1. 关于c++类的内存分配

    参考:这里 虽然有些地方错了,但是也可以一看,大概能加深对c++类相关的内存分配的了解 然后这还不算十分深入,更深入的可以看这里. 这本书是时候读一下了:<深度探索C++对象模型> (待续 ...

  2. String类的内存分配

    首先说一下Java内存分配.物理的内存是线性结构,并不存在拥有不同功能的不同区域,编译器(或者JVM)为了更高效地处理数据,会用不同的算法把内存分为各种区域,不同的区域拥有各自的特性,Java中,内存 ...

  3. C++ 学习笔记(四)类的内存分配及this指针

    类,是使用C++的最主要的内容.如果将c++与C语言做比较,我感觉类更像是结构体的加强进化版.在刚接触C++不久的时候总是让类,对象,this指针弄得一脸懵逼,我对类有比较清楚的认识是从理解类在内存中 ...

  4. 基类,派生类,内存分配情况 .xml

    pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...

  5. Java“类”的内存分配_case1

  6. 目录_Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)

    1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘 ...

  7. 【c/c++】内存分配大小

    测试平台:linux 32位系统 用sizeof()运算符计算分配空间大小.单位:字节 1. 数组名与变量名的区别 int main() { char q[] = "hello"; ...

  8. C++ Primer 学习笔记_98_特殊的工具和技术 --优化内存分配

    特殊的工具和技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自己主动执行合适的构造函数来初始化每一个动态 ...

  9. c# 字符串的内存分配和驻留池( 转 )

    刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例.如下: string s1 = "he ...

随机推荐

  1. Symmetric Difference

    function sym(args) { //return args; var arr = []; for(var i = 0; i < arguments.length; i++){ arr. ...

  2. 获取本机内存使用信息、DataTable占用内存空间

    相当于windows系统中的任务管理器,功能是通过系统的API实现的本机的监视,代码如下 using System;using System.Collections.Generic;using Sys ...

  3. git worktree

    git clone,不管是single-branch,还是non-single-branch,如果同时存在几个clone出来的branches,随着时间的推移,不停的编译.更新.编译...每个bran ...

  4. ROS实时采集Android的图像和IMU数据

    前言       临近毕业,整理一下之前做的东西.这篇博客来自于博主在2016年3月份投的一篇会议论文(论文主要介绍了一个基于手机摄像头和IMU的简单VIO系统,用于AR的Tracking部分,本博文 ...

  5. [转]centos6.6 rpm安装与管理

    centos6.6 rpm安装与管理 原文地址:http://www.centoscn.com/CentOS/2015/0414/5182.html   rpm包管理:安装.升级.卸载.查询.检验 安 ...

  6. 转载:分布式系统的CAP理论

    原文转载Hollis原创文章:http://www.hollischuang.com/archives/666 2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提 ...

  7. 添加Properties取值和枚举取值

    <!--配置文件--><property name="ppp"> <props> <prop key="11"> ...

  8. 第三章 Docker 入门

    第三章 docker 入门 3.1 确保docker已经就绪 首先查看docker程序是否存在,功能是否正常 [#3#cloudsoar@cloudsoar-virtual-machine ~]$su ...

  9. 框架介绍thinkphp

    ThinkPHP是一个免费开源的,快速.简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的.ThinkPH ...

  10. orale 函数大全[转]

    oracle函数大全 http://wenku.baidu.com/link?url=bXaGsnn8iN264GB8ec48IUPg5eRGDKAyAiSw0OBKL1I0mBVG549-2u9HT ...