On Wednesday, January 30, 2013 23:49:00 Namespace wrote: > Is the compiler (dmd) fit enough to detect and avoid unnecessary > casts? > > E.g. > [code] > void foo(T)(T num) { > int f = cast(int) num; > // ... > } > > foo(42); // cast is unnecessary > foo(4.2); // cast is necessary > [/code] > > Or should I wrote everytime > > [code] > void foo(T)(T num) { > static if (is(T == int) || isImplicitlyConvertible!(T, int)) { > int f = num; > } else { > int f = cast(int) num; > } > // ... > } > [/code] > > Until now I count on the compiler, that it detect this cases and > avoid casts. But I'm not 100% sure, so I want to ask.
You'd have to look at the generated code to know for sure what it did, but it would be poor optimization to not strip the cast when casting from a value to its own type. And really, I'd argue that it's premature optimization to really worry about it in the first place. I'd argue that it's a bug if unnecessary casts are not optimized out, but unless you're searching for compiler bugs, there shouldn't be any reason to worry about it. - Jonathan M Davis