$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] std::map::find() wrapper
From: John Bytheway (jbytheway+boost_at_[hidden])
Date: 2011-05-05 17:48:33
On 05/05/11 19:35, Marsh Ray wrote:
<snip>
> So I'm interpreting that as "Can you give an example of an actual C++
> program where the compiler does not emit the same code for references as
> the analogous code using plain pointers."
> 
> .... I played around with g++-4.6.0 and was not able to make it emit
> different code in the short time I'm willing to try. G++ seems to miss
> some opportunities for optimization of references, and seems to be smart
> about tracking pointer values.
There's this:
struct A { int x; };
struct B { int y; };
struct C : A, B {};
C& f(B& b) {
  return static_cast<C&>(b);
}
C* g(B* b) {
  return static_cast<C*>(b);
}
which compiles to:
0000000000000000 <_Z1fR1B>:
   0:   48 8d 47 fc             lea    -0x4(%rdi),%rax
   4:   c3                      retq
0000000000000010 <_Z1gP1B>:
  10:   48 8d 57 fc             lea    -0x4(%rdi),%rdx
  14:   31 c0                   xor    %eax,%eax
  16:   48 85 ff                test   %rdi,%rdi
  19:   48 0f 45 c2             cmovne %rdx,%rax
  1d:   c3                      retq
The compiler doesn't have to do a null-check for the reference case, so
it's shorter.
John Bytheway