分类: C/C++
2012-11-15 11:02:00
鱼没有脚印等级: |
得分:20 回复于: 2010-10-20 11:18:48 |
引用 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;要高. |