Chinaunix首页 | 论坛 | 博客
  • 博客访问: 714953
  • 博文数量: 126
  • 博客积分: 2944
  • 博客等级: 上校
  • 技术积分: 1160
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-17 11:09
个人简介

文章分类

全部博文(126)

文章存档

2022年(1)

2018年(1)

2017年(5)

2016年(5)

2013年(5)

2012年(21)

2011年(24)

2010年(1)

2009年(2)

2008年(12)

2007年(6)

2006年(19)

2005年(24)

分类: C/C++

2012-11-15 11:02:00

鱼没有脚印等级:Blank
引用 6 楼 xdxiaofeng 的回复:
1。 全局变量是一次分配,永久使用。 而局部变量是进入代码块的时候分配,退出代码块的时候释放。 这是全局变量和局部变量最根本的区别。 如果你要问哪个快 的话, 只要不是频繁分配的情况下,局部变量是全局变量一样快。 因为对于cpu来说, 无论什么变量都是一个地 址, cpu jump to 0x1 和jump to 0x10000一样快。 至于cache的话,通常缓存最近使用的数据, 我没有听说哪个 com……

可能我没有说清楚.以32位RISC为例,
    1.由于缓存是按照行来操作的,假定一行是32字节,可以容纳4个整型数据或32个字符型数据.由于函数调用的时候返回地址会放到栈中,那么返回 地址后面的几个数据可能也会被缓存起来,而这些数据可能就是局部变量.再者,局部变量在栈中是按顺序分配内存的,那么使用一个局部变量也可能让其他的局部 变量被缓存起来.因此,当你使用一个局部变量的时候,很有可能它已经处于数据缓存中.而全局变量没有这个优势.
    对于RISC来讲,由于栈指针的存在,加载一个栈上的数据到寄存器中一般只需要一条指令.比如MOVE reg, [SP+offset].而加 载一个任意地址上的数据到寄存器就没那么简单了,因为指令是32位的,地址也是32位,所以32位的地址并不总能被编码到32位的指令中.所以可能需要2 条指令:MOVE reg1的高16位, 地址的高16位;MOVE reg,[reg1+地址的低16位].当然CISC和这个不一样.
    全局变量可能还会引起MMU中断而导致TLB的重填,而局部变量一般不会,因为在程序的执行过程中,栈所在的页一般都会在TLB中.
    2.浮点寄存器一般位于浮点协处理器中,并不是所有的协处理器的时钟都可以和CPU的时钟保持一致.多数指令的执行都需要多个时钟周期,虽然由于 流水线的存在,使得看起来像是1个时钟周期.事实上对于一个支持多指令发射和乱序执行的CPU来 讲,MOVE floatpointREG, [addr];MOVE [addr], fixpointREG这个执行序列的效率甚至比 MOVE fixpointREG, [addr];MOVE [addr], fixpointREG;要高.
阅读(2922) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~