今天面试被问到一个类的内存问题,有些记不清楚了。用了 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. Tomcat8安装, 安全配置与性能优化

    一.Tomcat 安装 官网:http://tomcat.apache.org/ Tomcat8官网下载地址:http://tomcat.apache.org/download-80.cgi 为了便于 ...

  2. MySQL 数据库常用命令

    1.MySQL常用命令 create database name; 创建数据库 use databasename; 选择数据库 drop database name 直接删除数据库,不提醒 show ...

  3. Python SQLAlchemy --2

    本文為 Python SQLAlchemy ORM 一系列教學文: 接下來會更深入地探討查詢的使用. 查詢的基本使用法為 session.query(Mapped Class),其後可加 .group ...

  4. DUILIB 实现微信气泡聊天效果

    最近由于项目原因,需要做一个产品内嵌的IM聊天系统.而且要象微信类似的效果:界面也要比较炫: 开始考虑用MFC,但MFC的控件自绘很麻烦,后来又考虑QT,倒是使用控件使用方便,但QT库太大,所以也放弃 ...

  5. sql server数据库区分大小写

    来源http://blog.sina.com.cn/s/blog_457d6e63010108tv.html 未测试过 SQL SERVER 2000/2005中默认不区分大小写,可以通过collat ...

  6. Android发送短信核心代码

    核心代码:(1)SmsManager manager = SmsManager.getDefault(); //获得默认的消息管理器(2)ArrayList<String> list = ...

  7. ztree插件的使用

    在bootstrap中使用ztree插件做树形架构,由于觉得原始的树形不够美观,所以改了其中的css插件 demo演示,以及各种属性的用法网站:  http://www.treejs.cn/v3/de ...

  8. 关于Servlet手动配置web.xml部分代码

    <servlet> <!-- 文件名 --> <servlet-name>deleteServlet</servlet-name> <!-- 文件 ...

  9. [Notes] AWS Automation using script and AWS CLI

    (c) 2014 Amazon Web Services, Inc. and its afflialtes, All rights reserved. The content in this file ...

  10. DAP in Coresight

    DAP简单来说分成 DP + AP , Debug Port + Access Port Debug Port--和JTAG的接口叫做Debug Port Access Port--和内部其他的接口叫 ...