C/C++指针的由来和功效

来源:互联网 发布:关闭linux防火墙 编辑:程序博客网 时间:2024/04/28 23:02

指针一直是个头疼的问题,看林锐写的指导,他当初写了十万行代码但是就是避免用指针全部用数组,可见指针确实令人生畏惧------另一个令程序员头疼的是中断。他们有同一个性质:跟硬件太相关,而硬件又设计得偏偏很复杂,偏偏硬件和软件又是貌似两种思维模式,能融会贯通的人数量不多。所以我打算从硬件端说一下指针的由来。

事情得从计算机体系结构开始。

1) 速度:

CPU在设计的时候(知道为什么Linus大神跑到一个设计CPU的名不见经传的公司去打工了吧,他是为了彻底搞清楚这件事),内部是有一堆“寄存器”的,register,简写reg。比如verilog语言是这样定义的:

reg [31:0] regA;

然后CPU内的控制单元往regA里面读写数据因为在CPU内部,速度非常之快,并且可以流水。并且把regA加或者减1这种运算也非常之快,不需要往外部总线上去取数据,写完还要存回去。

辣么,如果我要读一堆地址连续的数据,直接把寄存器regA++,然后按照regA的值去查找内存,速度也会快很多,比先查找内存某个地方得到地址数据,再改变地址总线数据去找那个数据要节省N次总线访问的时间。

通常CPU芯片设计里会有个“寄存器堆”,有很多寄存器可用。我猜编译器在用完register之后也许会用内存里面的某个地址作为指针,但是现在很多书和文章直接说指针就是存在内存中的一段地址,这是不靠谱的。那样速度优势并没有发挥出来。

而内存在verilog里面例如是这样定义的:

reg [31:0] mem [1023:0];  //这是一个32bit宽1K深度的内存

它需要通过总线和地址来访问。

2)方便:数组操作

我觉得指针最大好处是方便数组操作,当你需要连续读取一堆连续地址的数据时,真是太爽了!

3)可以用来写底层驱动

写底层驱动你必须得亲自操作总线去访问外设的寄存器(又是寄存器,不过性质真的和CPU里的寄存器一样)。假如没有指针,怎么去访问总线?

4)函数指针传递

待续。。。有时间再加



0 0
原创粉丝点击