找回密码
 欢迎注册
楼主: 无心人

[原创] 来点复杂的吧

[复制链接]
 楼主| 发表于 2009-2-23 08:48:21 | 显示全部楼层
如何测试当前编译器是VC还是GCC?? 他们定义的宏是?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-23 09:06:05 | 显示全部楼层
可检查 macro _MSC_VER 是否已定义。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-23 10:07:04 | 显示全部楼层
原帖由 无心人 于 2009-2-23 08:17 发表 我倾向于乘法就不要调用加减了 光一个函数调用的开销就够算一次加法了
直接调用更加好,增加可读性.至于函数调用的开销问题,通常编译器会自动展开
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-23 10:32:15 | 显示全部楼层
gcc如何不让编译器错误优化 比如 t = (t >> 31) + (t & 0x7FFFFFFF); t = (t >> 31) + (t & 0x7FFFFFFF); 连续两个相同的语句,很可能被优化成一句 如何避免
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-23 20:56:24 | 显示全部楼层
GCC如何防止过度优化? 见上面内容
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-23 21:01:32 | 显示全部楼层
我想编译器不会对它进行优化, 因为它们前后有依赖关系。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-23 21:03:52 | 显示全部楼层
可是俺连续三次用那个语句保证t < 2^31 - 1 都不对 而直接 while ( t >= 0x7FFFFFFF) t = (t >> 31) + (t & 0x7FFFFFFF) 却好像使程序正常运行了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-24 09:25:13 | 显示全部楼层
这说明可能调用有限次就是错的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-24 10:01:21 | 显示全部楼层
可是假设数字 DWORD a 如果保证a < P31 = 2^31 - 1 只要最多调试2次就可以了 因为$ 2^32 / {2^31-1} < 3$ 啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-24 17:56:34 | 显示全部楼层
崩溃中 mathe的程序 比如加法 inline DWORD modAdd31(DWORD l, DWORD r) { return ((l + r)%P); } 我优化为 inline DWORD modAdd31(DWORD l, DWORD r) { DWORD t; l = (l >> 31) + (l & P); l = (l >> 31) + (l & P); r = (r >> 31) + (r & P); r = (r >> 31) + (r & P); t = l + r; t = (t >> 31) + (t & P); t = (t >> 31) + (t & P); return (t); } 结果不行 其中P = 0x7FFFFFFF 明明应该可以这么优化的啊 期望高人解惑 ============================ 已经明白怎么回事了 此代码对P不能处理
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-23 16:13 , Processed in 0.023846 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表