On Fri, Mar 16, 2012 at 12:11:44AM +0100, Simen Kjærås wrote: > On Thu, 15 Mar 2012 23:44:09 +0100, foobar <f...@bar.com> wrote: > > >Is swap usually inlined by the compiler? > > This is the body of swap for simple types: > > auto tmp = lhs; > lhs = rhs; > rhs = tmp; > > For more complex types: > > ubyte[T.sizeof] t = void; > auto a = (cast(ubyte*) &lhs)[0 .. T.sizeof]; > auto b = (cast(ubyte*) &rhs)[0 .. T.sizeof]; > t[] = a[]; > a[] = b[]; > b[] = t[]; > > So yeah. If that's not inlined, something's wrong.
Ideally, though, a swap of large objects should be a single loop of xchg instructions (in x86 anyway, xchg may not exist on other architectures). Unless dmd is much more clever than I thought, the above code would generate 3 loops, which uses more memory and is (probably) slower. T -- Never ascribe to malice that which is adequately explained by incompetence. -- Napoleon Bonaparte