无心人 发表于 2009-2-23 08:48:21

如何测试当前编译器是VC还是GCC??
他们定义的宏是?

gxqcn 发表于 2009-2-23 09:06:05

可检查 macro _MSC_VER 是否已定义。

mathe 发表于 2009-2-23 10:07:04

原帖由 无心人 于 2009-2-23 08:17 发表 http://bbs.emath.ac.cn/images/common/back.gif
我倾向于乘法就不要调用加减了
光一个函数调用的开销就够算一次加法了
直接调用更加好,增加可读性.至于函数调用的开销问题,通常编译器会自动展开

无心人 发表于 2009-2-23 10:32:15

gcc如何不让编译器错误优化

比如
t = (t >> 31) + (t & 0x7FFFFFFF);
t = (t >> 31) + (t & 0x7FFFFFFF);
连续两个相同的语句,很可能被优化成一句
如何避免

无心人 发表于 2009-2-23 20:56:24

GCC如何防止过度优化?
见上面内容

gxqcn 发表于 2009-2-23 21:01:32

我想编译器不会对它进行优化,
因为它们前后有依赖关系。

无心人 发表于 2009-2-23 21:03:52

:)

可是俺连续三次用那个语句保证t < 2^31 - 1
都不对

而直接
while ( t >= 0x7FFFFFFF)
   t = (t >> 31) + (t & 0x7FFFFFFF)

却好像使程序正常运行了

mathe 发表于 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不能处理
页: 1 2 3 4 [5] 6 7
查看完整版本: 来点复杂的吧