关于优化,可以说途径千千万万,没有一定的法则,但大抵有那么几个比较基本的法则,比如:充分了解计算机的体系结构,了解自己所处理的数据的特点,熟悉编译器的工作原理等等。今天我想谈谈关于编译器方面的一些见解,编译器分为预处理,编译,链接等大概的几个部分,如果能够清楚这几个阶段编译器各做了什么事情,编译器在哪方面比较聪明,能够替你做一些优化,又在哪方面比较弱智,无法替你做优化,你就能很清醒地知道,你做的哪些优化是有效的,下面举例说明:
今天有人提出在汇编指令中,去掉一些地址偏移乘法计算,这种善于动脑筋的方法值得赞赏,但可能对编译过程理解不是很透彻,会造成认识上的一些偏差。
比如如下指令:movq 8*4(%%rsi),%%rax
这是一个移动数据的指令,操作的对象是一个128位的数,其中源操作数的选址方式是寄存器间接寻址,地址偏移量是8*4,目的操作数是一个128位的普通寄存器。很显然,源操作数有一个地址偏移计算的过程,其过程常规理解应该是,首先计算8*4,得到32,然后将32加到地址寄存器%%rsi中去,然后再去执行寻址内存的操作,那么按照这个理解,我们想当然可以提出如下优化:
movq 32(%%rsi),%%rax
很显然这个过程少了一个计算8*4=32的过程,应该能起到优化作用,但果真如此吗&#