只有汇编能告诉你为什么
分析了一下编译器(VC8)生成的汇编代码,发现问题是编译器造成的。。。 在没有用SSE优化的情况下,编译器生成的代码非常好,直逼手写代码。。。 而在用了SSE优化以后,编译器不能合理的分配和利用寄存器,并且生成了很多冗余的指令,导致代码简直一团糟,接近于弱智水平。。。 具体可参看下面的汇编代码,我在重要的行后面加了注释,方便理解。。。 没用SSE并行: ; COMDAT ?intersectEye@RayTriangle@@QAE_NPAVe_Ray@@PAVe_RayState@@@Z _TEXT SEGMENT _t$ = -56 ; size = 4 _dot_nd$ = -52 ; size = 4 _hit$ = -48 ; size = 12 _ray_dir$ = -36 ; size = 12 _ray_src$ = -24 ; size = 12 _bary$ = -12 ; size = 12 ?intersectEye@RayTriangle@@QAE_NPAVe_Ray@@PAVe_RayState@@@Z PROC NEAR ; RayTriangle::intersectEye, COMDAT ; _this$ = ecx ; _ray$ = eax ; _state$ = edi ; 146 : { sub esp, 56 ; 00000038H ;