これと同じような容器があります。
template <typename Nat, typename Elt>
class NatMap {
public:
Elt& operator[] (Nat nat) {
return tab [nat.GetRaw()];
}
private:
Elt tab [Nat::kBound];
};
Elt がデフォルトのコンストラクターを持っているという要件を削除したかったのです。
template <typename Nat, typename Elt>
class NatMap {
public:
Elt& operator[] (Nat nat) {
return ((Elt*)tab) [nat.GetRaw()];
}
private:
char tab [Nat::kBound * sizeof(Elt)];
};
私は g++-4.3 を使用していますが、このコードは以前のアプリケーションよりも25% 遅く動作します。残念ながら、速度低下は合成ベンチマークでは現れません。コンパイラの最適化、エイリアシング、アライメント、または同様のものに関するものだと思います。
パフォーマンスを取り戻すにはどうすればよいですか?(デフォルトのコンストラクターは必要ありませんが)
アップデート:
ちょうど今、新しい g++-4.4 を試してみたところ、後者のコードに対して次の警告が表示されました。
dereferencing pointer '<anonymous>' does break strict-aliasing rules