У меня есть контейнер, похожий на этот.
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