一,C/C++内存模型

1.内存模型分类

  • 栈区:由编译器自动分配和释放,用来存放函数的参数,局部变量。存放在栈中的数据只在当前函数及下一层函数中有效,函数一旦结束,这些数据就被释放了。
  • 堆区:由程序员分配和释放,如果程序员没有释放则在程序结束时由OS释放,由于忘记释放通常会出现内存泄露问题。
  • 全局(静态)区:用来存储全局变量和静态变量,程序结束时由OS释放。
  • 常量区:存放字面量,不允许修改,如字符串"Hello,Unreal",程序结束时由OS释放。
  • 代码区:存放代码(如函数),不允许修改(类似常量区),但可以执行(不同于常量区)。

2.理解函数,代码和内存分配的问题

  函数是由一条条的操作指令(代码)组合而成的,其指令可以是定义变量向内存申请空间,或者是操作指令,例如两数相加。

二,C++中类和对象的内存分配模型

1.C++中类和对象

  在C语言中,“数据”和“函数”是分开来声明的,也就是说,语言并没有支持“语言和函数”之间的关联性。但是在C++中却提供了“类”来将“数据”和“函数”绑定在了一起。C++中的类由成员变量,静态成员变量,构造函数,成员函数,静态函数和虚函数组成。下面我们来研究组成类的数据和函数是如何在内存中分配的。

2.C++中是如何管理类和对象的

  我们首先来定义几个类,然后对下面的代码进行分析。

# include<iostream>
using namespace std;
/* 定义第一个类:12个字节 */
class C1
{
private:
int a;//
int b;//
int c;//
};
/* 定义第二个类:12个字节 */
class C2
{
private:
int a;//
int b;//
int c;//
static int d;//
};
/* 定义第三个类:4个字节 */
class C3
{
private:
int a;//
static int b;//
public:
void setA(int a)//
{
this->a = a;
}
int getA()//
{
return this->a;
}
static void add()//
{
C3::b += ;
}
};
/* 定义结构体:4个字节 */
struct S1
{
int a;
static int b;
}; int main()
{
cout << "C1类所占字节数:" << sizeof(C1) << endl;
cout << "C2类所占字节数:" << sizeof(C2) << endl;
cout << "C3类所占字节数:" << sizeof(C3) << endl;
cout << "S1结构体所占字节数:" << sizeof(S1) << endl; return ;
}

 3.上述代码结果分析

  • C++中的成员变量和成员函数是分开存储的。
  • 普通的成员变量存放在对象(变量)中,与结构体变量有相同的内存布局和字节对齐方式。
  • 静态成员变量存储在全局(静态)区。
  • 成员函数和静态函数存储在代码区。

4.C++成员变量存放在对象中,那么成员函数是如何管理的?

 5.上述代码总结

  • C++的类是用结构体实现的,因此类中的成员变量和结构体里的变量内存布局方式一致。
  • C++类中的成员函数隐式包含一个指向当前对象的指针,哪个对象调用该函数,C++编译器就默认将该对象包含在函数中。
  • 静态成员变量和静态成员函数属于类,因此静态成员函数不包含指向具体对象的指针。

6.this指针

  • 通过上述示例,我们发现类中的普通成员函数包含一个this指针,该指针指向调用当前函数的对象,即谁调用我,我就指向谁。
  • this指针通常用于在成员函数或者构造函数的形参和成员变量一致的时候,用this指针来表示当前对象的成员变量,形参直接赋值给成员变量即可。

C++中的类与对象模型的更多相关文章

  1. C++中的类继承(4)继承种类之单继承&多继承&菱形继承

    单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或以上直接父类时称这个继承关系为多继承.这种继承方式使一个子类可 ...

  2. C++中的类继承之单继承&多继承&菱形继承

     C++中的类继承之单继承&多继承&菱形继承 单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或 ...

  3. 《python解释器源码剖析》第13章--python虚拟机中的类机制

    13.0 序 这一章我们就来看看python中类是怎么实现的,我们知道C不是一个面向对象语言,而python却是一个面向对象的语言,那么在python的底层,是如何使用C来支持python实现面向对象 ...

  4. Python中的类、对象、继承

    类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...

  5. 基础知识(05) -- Java中的类

    Java中的类 1.类的概念 2.类中的封装 3.对象的三大特征 4.对象状态 5.类与类之间的关系 ------------------------------------------------- ...

  6. Objective-C中的类目,延展,协议

    Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...

  7. CSS中伪类及伪元素用法详解

    CSS中伪类及伪元素用法详解   伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...

  8. Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法

    Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法 如下面所示,同时导入这两个,会提示其中一个与另一个产生冲突. 1i ...

  9. C#中timer类的用法

    C#中timer类的用法 关于C#中timer类  在C#里关于定时器类就有3个   1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类 ...

随机推荐

  1. C语言深度剖析-----函数与指针的分析

                          指针的本质 指针需要保证指向任意数据类型,所以指针变量都占用32位bit即4字节. PS:不同机器上,指针占用内存不一                   ...

  2. 24、驱动调试之printk

    1.uboot跳转到内核启动的时候通过环境变量 console设置控制台 (console = ttySAC0表示输出到串口,并从串口结束输入,也可以设置console=tty1,表示输出到LCD,从 ...

  3. 【例题5-3 UVA - 10815】Andy's First Dictionary

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用stringstream来处理中间的标点. ->直接把他变成一个空格. 然后重新输入进去. set默认的字典序就是升序的了. ...

  4. surfingkeys

    https://www.appinn.com/surfingkeys-for-chrome/ 尝试使用.听说能支持js Vimium 不支持拷贝链接的文本. 不支持stop page https:// ...

  5. iOS开发:枚举的介绍与使用

    #import "ViewController.h" //第一种写法 typedef enum { XMGDemoTypeTop, XMGDemoTypeBottom, }XMGD ...

  6. 关于LayoutParams 分类: H1_ANDROID 2013-10-27 20:34 776人阅读 评论(0) 收藏

    每一个布局均有一个叫LayoutParams的内部类,如: LinearLayout.LayoutParams  RelativeLayout.LayoutParams  AbsoluteLayout ...

  7. J2EE&JavaEE概述

    来源 Sun公司在1998年发表JDK1.2版本的时候, 使用了新名称Java 2 Platform,即"Java2平台",修改后的JDK称为Java 2 Platform Sof ...

  8. [RxJS] Split an RxJS observable with window

    Mapping the values of an observable to many inner observables is not the only way to create a higher ...

  9. Django之模板过滤器

    Django 模板过滤器也是我们在以后基于 Django 网站开发过程中会经常遇到的,如显示格式的转换.判断处理等.以下是 Django 过滤器列表,希望对为大家的开发带来一些方便. 一.形式:小写 ...

  10. [ES6] Use ES6 Proxies

    A JavaScript Proxy allows you to intercept operations performed on objects, arrays, or functions lik ...