I have a container similar to this one.
template <typename Nat, typename Elt>
class NatMap {
 public:
  Elt& operator[] (Nat nat) { 
    return tab [nat.GetRaw()];
  }
 private:
  Elt tab [Nat::kBound];
};
I wanted to drop the requirement for Elt to have a default constructor:
template <typename Nat, typename Elt>
class NatMap {
 public:
  Elt& operator[] (Nat nat) { 
    return ((Elt*)tab) [nat.GetRaw()];
  }
 private:
  char tab [Nat::kBound * sizeof(Elt)];
};
I use g++-4.3 and this code works 25% slower in my application than the previous one. Unfortunately the slowdown does not manifest in a synthetic benchmark. I guess it is something about compiler optimizations, aliasing, aligning, or similar stuff.
What should I do to get my performance back? (while not needing the default constructor)
Update:
Just now I tried new g++-4.4 and it gave me a following warning for the latter code:
dereferencing pointer '<anonymous>' does break strict-aliasing rules
 
     
     
    