一,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. mootools常用特性和示例(基础篇1)

    网上关于mootools这个库的信息很少. 公司一些老的项目用到了mootools库,因为要维护,所以接触到了mootools. mootools(文档)官网:http://www.chinamoot ...

  2. 3、Pycharm使用

    1.设置文件模板 file->settings->Editor->File and Code Templates->Python Script 2.运行 a.点击要运行的文件, ...

  3. mysql 存相同内容:utb8mb4 会比 utf8 占用更多的内存吗,utf8mb4 浪费内存吗?utf8 utf8mb4 区别

    原文:mysql 存相同内容:utb8mb4 会比 utf8 占用更多的内存吗,utf8mb4 浪费内存吗?utf8 utf8mb4 区别 参考:http://www.fengyunxiao.cn u ...

  4. windows go 安装

    go的安装很简单,下载go的msi文件 这里提供go1.9的msi下载链接 https://www.lanzous.com/i2gb54d 直接全部next就行,默认安装在了c盘的go 然后配置环境变 ...

  5. jquery-7 jquery中的文档处理方法有哪些(方法的参数表示功能增强)

    jquery-7 jquery中的文档处理方法有哪些(方法的参数表示功能增强) 一.总结 一句话总结:多看参考文档,多看主干目录.一般的功能分两个方法来实现,一个对应标签,一个对应标签和事情,比如克隆 ...

  6. 关于http传输base64加密串的问题

    问题场景: 在使用luacurl进行http post请求的时候,post的内容是一串json串.json传里面的某个字段带上了base64加密的串. 如post的内容如下: xxxxxx{" ...

  7. android jni与java之间数据传输时怎么转换

    1.c中的jstring数据类型就是java传入的String对象,经过jni函数的转化就能成为c的char*. Java 类型 本地c类型 说明 boolean jboolean 无符号 8 位 b ...

  8. ios开发不能不知的动态修复bug补丁第三方库JSPatch 使用学习:JSPatch导入、和使用、.js文件传输加解密

    JSPatch ios开发不能不知的动态修复bug补丁第三方库JSPatch 使用学习:JSPatch导入.和使用..js文件传输加解密 ios开发面临审核周期长,修复bug延迟等让人无奈的问题,所以 ...

  9. JavaStuNote 4

    装箱(inbox)和拆箱(outbox) 代表了类类型和基本类型之间的转换行为. 手动版本号: Integer b = new Integer(10); Int a = b.intValue; 自己主 ...

  10. [Angular] Difference between ViewChild and ContentChild

    *The children element which are located inside of its template of a component are called *view child ...