This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Aliasing performance problem.
- From: Åukasz Lew <lukasz dot lew at gmail dot com>
- To: gcc-help at gcc dot gnu dot org
- Date: Sun, 1 Nov 2009 19:35:37 +0100
- Subject: Aliasing performance problem.
Hi,
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.
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
What should I do to get my performance back? (while not needing the
default constructor)
Thanks for any suggestion.
Lukasz
PS
If this is lack optimizations because of aliasing info, this has to be
doable somehow as STL have the same problem, doesn'it ?