Author: Robert Hyatt
Date: 20:16:56 07/07/03
Go up one level in this thread
On July 07, 2003 at 13:35:02, Dieter Buerssner wrote: >On July 07, 2003 at 10:34:53, Robert Hyatt wrote: > >>On July 06, 2003 at 14:05:03, Omid David Tabibi wrote: >> >>>On July 06, 2003 at 13:12:25, Robert Hyatt wrote: > >>>>#define abs(x) ((x<0) ? -x : x) > >>>What's the difference between the above macro and the function >>> >>>int simple_abs (int i) { >>> return (i >= 0) ? i : -i; >>>} >>> >>>when inlined? >> >>No difference that I know of, if you have inlining enabled. > >Why do you think this? See for example my answer to Omid's question. Some >problems with the macro can be fixed, by putting the argument x into >parentheses. > >#define abs(x) ((x)<0 ? -(x) : (x)) > I always do this, as it is a known trick. I didn't type it in my response however... The problems with things like abs(++x) I _never_ do. For obvious reasons. Yes, there are _plenty_ of ways to shoot yourself in the foot, I don't pass ++ or -- to _any_ function, however. >As you stated it, for example abs(a+b) will fail (-a+b is in general not >-(a+b)). The problem with the sideeffects cannot be fixed in Standard C. In many >cases, slowness, cannot be fixed; for example the compiler may not be able to >find out, that a function call has no sideeffect. > >abs(slow_func_with_no_side_effect(a)) > >Similar cases, when the argument includes (volatile) global vars. > >The function version has no problem. At least with slightly modern compilers, it >should be best to use the abs() provided by the compiler in most cases. The only >reason, that comes into mind, that C has this abs() at all, is that it may be >done fast by tricks (provided by the compiler), that are not available in pure C >code. > >Regards, >Dieter
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.