C++ 代码优化(二)

王朝c/c++·作者佚名  2006-01-06
窄屏简体版  字體: |||超大  

使用数组型代替指针型

使用指针会使编译器很难优化它。因为缺乏有效的指针代码优化的方法,编译器总是假设指针可以访问内存的任意地方,包括分配给其他变量的储存空间。所以为了编译器产生优化得更好的代码,要避免在不必要的地方使用指针。一个典型的例子是访问存放在数组中的数据。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];

}

}  

注意: 源代码的转化是与编译器的代码发生器相结合的。从源代码层次很难控制产生的机器码。依靠编译器和特殊的源代码,有可能指针型代码编译成的机器码比同等条件下的数组型代码运行速度更快。明智的做法是在源代码转化后检查性能是否真正提高了,再选择使用指针型还是数组型。 

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航