У меня есть контейнер, похожий на этот.Странная проблема с производительностью
template <typename Nat, typename Elt>
class NatMap {
public:
Elt& operator[] (Nat nat) {
return tab [nat.GetRaw()];
}
private:
Elt tab [Nat::kBound];
};
Я хотел отказаться от требования для Ег, чтобы иметь конструктор по умолчанию:
template <typename Nat, typename Elt>
class NatMap {
public:
Elt& operator[] (Nat nat) {
return ((Elt*)tab) [nat.GetRaw()];
}
private:
char tab [Nat::kBound * sizeof(Elt)];
};
Я использую г ++ - 4,3 и этот код работает 25% медленнее в моем приложении, чем предыдущий. К сожалению, замедление не проявляется в синтетическом бенчмарке. Я думаю, что это что-то о оптимизации компилятора, псевдониме, выравнивании или подобном материале.
Что мне делать, чтобы вернуть свое исполнение? (Пока не требуется конструктор по умолчанию)
Update:
Только теперь я попробовал новый г ++ - 4,4 и он дал мне следующее предупреждение для последнего кода:
dereferencing pointer '<anonymous>' does break strict-aliasing rules
Вы используете «размещение нового» или какой-нибудь другой уродливый взлом? Нежелание по умолчанию ctor можно обойти, определив хотя бы один ctor. – dirkgently
Размещение нового не является уродливым взломом, но является важной особенностью языка. Обычно он красиво завернут в контейнер, как вектор, поэтому люди думают, что это неясно. Пожалуйста, не делайте этого, это не более чем способ вызова конструктора существующего объекта. –
И чтобы ответить на ваш вопрос, я не использую новое место размещения, но я буду, поскольку мне нужно реализовать контейнер, который поддерживает объекты, которые имеют только имена конструкторов публично. –