最是人间留不住,朱颜辞镜花辞树。
——《蝶恋花 ·阅尽天涯离别苦》【清】王国维
今天我们来说一说这个C++区别其他语言最明显的功能,指针。C++的指针可以说是功能强大,很多游戏的外挂中核心就是指针。
小知识:
计算机体系中的存储层次是指将不同速度、容量和成本的存储设备按照一定顺序组合起来,以满足计算机对数据处理和存储的需求。这种层次结构的设计旨在优化存储系统的性能,同时考虑成本效益。以下是对计算机体系中存储层次的详细解析:
一、存储层次的基本概念
存储层次是在计算机体系结构下存储系统层次结构的排列顺序。每一层相对于下一层都拥有较高的速度和较低的延迟性,但容量较小。这种设计使得计算机能够高效地利用存储资源,同时降低总体成本。
二、存储层次的组成
一般来说,计算机体系中的存储层次可以分为以下几层:
- CPU寄存器:
- 特点:速度最快,容量最小,直接参与CPU的运算。
- 作用:用于暂存指令、数据和地址,以减少对内存的访问次数。
- 高速缓存(Cache):
- 特点:速度较快,容量较小,位于CPU和主存之间。
- 作用:作为主存的缓冲,存储CPU近期可能访问的数据和指令,以减少CPU对主存的访问延迟。
- 类型:包括一级缓存(L1 Cache)、二级缓存(L2 Cache)等,有的处理器还包含三级缓存(L3 Cache)。
- 主存(内存):
- 特点:速度适中,容量较大,是CPU和外存之间的桥梁。
- 作用:用于存放当前正在运行的程序和数据,供CPU直接访问。
- 类型:主要由DRAM(动态随机存取存储器)组成,也有部分使用SRAM(静态随机存取存储器)作为高速缓存。
- 辅助存储器(外存):
- 特点:速度慢,容量大,成本低。
- 作用:用于长期存储大量数据和程序,当需要时再将数据调入主存。
- 类型:包括硬盘、固态硬盘(SSD)、光盘、磁带等。
三、存储层次的工作原理
- 局部性原理:程序的执行具有局部性,即程序在一段时间内会集中访问某个区域的数据和指令。这是存储层次结构设计的基础。
- 缓存机制:高速缓存利用局部性原理,预先将CPU可能访问的数据和指令从主存调入缓存,以提高访问速度。当CPU访问数据时,首先会在缓存中查找,如果命中则直接访问缓存;如果未命中,则访问主存并可能将数据调入缓存。
- 虚拟存储:在主存和辅存之间形成虚拟存储系统,通过地址映射和页面置换等技术,实现大容量存储空间的透明访问。
四、存储层次的性能优化
- 缓存替换策略:如LRU(最近最少使用)算法、FIFO(先进先出)算法等,用于优化缓存中的数据替换,提高缓存命中率。
- 交叉编址:通过多体交叉编址技术提高主存的访存速度。
磁盘调度算法:如SCAN(电梯算法)、C-SCAN(循环扫描算法)等,用于优化磁盘的访问顺序,减少寻道时间和旋转延迟。
正文:
C++指针和其它语言的区别:
1.抽象级别:C++的指针提供了相对较低级别的内存访问能力,允许程序员直接管理和操作内存地址。而其他一些高级编程语言(如Java、Python)则可能使用引用或类似的机制来抽象指针的概念,不允许或限制直接访问内存地址。
2.安全性:由于C++指针提供了直接访问内存的能力,因此也带来了更高的安全风险,如野指针、内存泄漏等问题。而其他编程语言通过抽象指针概念,提供了更高的内存安全性。
3.语法和用法:C++的指针具有特定的语法和用法,如指针声明、指针运算等。而其他编程语言的“指针”或类似机制可能有不同的语法和用法。
总的来说,C++的指针与其他编程语言的指针或类似机制在抽象级别、安全性和语法用法上存在差异。这些差异反映了不同编程语言在设计哲学和用途上的不同考虑。
指针地作用
1.直接访问内存:通过指针,可以直接访问和修改内存中的数据,这为程序员提供了灵活的数据操作能力。
2.实现动态内存管理:C++指针与动态内存分配函数(如new和delete)配合使用,可以实现动态内存管理,即在程序运行时根据需要分配和释放内存。
3.传递数据的高效方式:通过传递指针,可以避免复制大型数据结构,从而提高程序的运行效率。
支持数组和字符串的操作:C++指针可以方便地用于遍历和操作数组和字符串。
4.实现函数回调和事件处理:指针可以用于指向函数,从而实现回调函数和事件处理机制。
指针基础:
内存是由很多内存单元组成的。这些内存单元用于存放各种类型的数据。
计算机对内存的每一个内存单元都进行了编号,这个编号就称为内存地址,内存地址决定了内存单元在内存中的位置。
这些编号通常很长,所以要记住它们很不容易,所以C++语言的编译器让我们通过名字来访问这些内存位置(就是变量名)。
指针定义的基本形式:指针本身就是一个变量,其符合变量的定义地基本形式,只不过它存储的是一个变量的地址。一个指针就只能存储一个变量的地址。
如:int a=110,b=-1;
double c=3.14;
int*d=&a;
double*e=&c;
通过一个指针访问它所指向的地址的过程称为间接访问或者是引用指针;这个用于执行间接访问的操作符是单目运算符*(只需要一个操作数。)
如:cout<<"a的地址"<<d<<endl ; cout<<"变量a"<<*d<<endl;
这就是简单的指针表示,如果输出的d,那么就会得到a的地址,如果输出的是*d那么就会得到的变量a。
代码演示:
include<iostream>
using namespace std;
int main()
{
int a=110;
double c=6.1211;
int*d=&a;
double*e=&c;
cout<<"a的地址"<<d<<endl;
cout<<"变量a"<<*d<<endl;
cout<<"c的地址"<<e<<endl;
cout<<"变量c"<<*e<<endl;
return 0;
}
大家可以自己试一试,在自己的编译器上使用断点可以更好的看到代码内部的变化,加强自己的理解。
这里我提醒一点:我们在利用断点在监视器上观察代码,我们会发现指针也是有地址的,也就说指针也是有地址的,且会存储其他变量的地址。
标签:存储,缓存,C++,访问,内存,最强,指针 From: https://blog.csdn.net/2301_81280642/article/details/142027558