使用数组型代替指针型
使用指针会使编译器很难优化它。因为缺乏有效的指针代码优化的方法,编译器总是假设指针可以访问内存的任意地方,包括分配给其他变量的储存空间。所以为了编译器产生优化得更好的代码,要避免在不必要的地方使用指针。一个典型的例子是访问存放在数组中的数据。C++ 允许使用操作符 [] 或指针来访问数组,使用数组型代码会让优化器减少产生不安全代码的可能性。比如,x[0] 和x[2] 不可能是同一个内存地址,但 *p 和 *q 可能。强烈建议使用数组型,因为这样可能会有意料之外的性能提升。
不好的代码 推荐的代码
typedef struct
{
float x,y,z,w;
} VERTEX;
typedef struct
{
float m[4][4];
} MATRIX;
void XForm(float* res, const float* v, const float* m, int nNumVerts)
{
float dp;
int i;
const VERTEX* vv = (VERTEX *)v;
for (i = 0; i <; nNumVerts; i++)
{
dp = vv->;x * *m ++;
dp += vv->;y * *m ++;
dp += vv->;z * *m ++;
dp += vv->;w * *m ++;
*res ++ = dp;// 写入转换了的 x
dp = vv->;x * *m ++;
dp += vv->;y * *m ++;
dp += vv->;z * *m ++;
dp += vv->;w * *m ++;
*res ++ = dp;// 写入转换了的 y
dp = vv->;x * *m ++;
dp += vv->;y * *m ++;
dp += vv->;z * *m ++;
dp += vv->;w * *m ++;
*res ++ = dp;// 写入转换了的 z
dp = vv->;x * *m ++;
dp += vv->;y * *m ++;
dp += vv->;z * *m ++;
dp += vv->;w * *m ++;
*res ++ = dp;// 写入转换了的 w
vv ++; // 下一个矢量
m -= 16;
}
}
typedef struct
{
float x,y,z,w;
} VERTEX;
typedef struct
{
float m[4][4];
} MATRIX;
void XForm (float* res, const float* v, const float* m, int nNumVerts)
{
int i;
const VERTEX* vv = (VERTEX*)v;
const MATRIX* mm = (MATRIX*)m;
VERTEX* rr = (VERTEX*)res;
for (i = 0; i <; nNumVerts; i++)
{
rr->;x = vv->;x * mm->;m[0][0] + vv->;y * mm->;m[0][1]
+ vv->;z * mm->;m[0][2] + vv->;w * mm->;m[0][3];
rr->;y = vv->;x * mm->;m[1][0] + vv->;y * mm->;m[1][1]
+ vv->;z * mm->;m[1][2] + vv->;w * mm->;m[1][3];
rr->;z = vv->;x * mm->;m[2][0] + vv->;y * mm->;m[2][1]
+ vv->;z * mm->;m[2][2] + vv->;w * mm->;m[2][3];
rr->;w = vv->;x * mm->;m[3][0] + vv->;y * mm->;m[3][1]
+ vv->;z * mm->;m[3][2] + vv->;w * mm->;m[3][3];
}
}
注意: 源代码的转化是与编译器的代码发生器相结合的。从源代码层次很难控制产生的机器码。依靠编译器和特殊的源代码,有可能指针型代码编译成的机器码比同等条件下的数组型代码运行速度更快。明智的做法是在源代码转化后检查性能是否真正提高了,再选择使用指针型还是数组型。