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