Недавно я задал вопрос о структурах и оптимизации некоторых перегруженных операторов.Усовершенствования оператора Vector2
Теперь, я принял эти улучшения в сердце (или некоторые/большинство из них), и я возвращаюсь со следующими функциями (не являющиеся членами функции, как я хочу, чтобы они были C уступчивыми, если это возможно) ,
inline Vector2& operator+=(Vector2 &a, const Vector2 &b)
{
a.x += b.x;
a.y += b.y;
return a;
}
inline Vector2 operator+(Vector2 a, const Vector2 &b)
{
a += b;
return a;
}
inline Vector2& operator*=(Vector2 &a, const float &n)
{
a.x *= n;
a.y *= n;
return a;
}
inline Vector2 operator*(Vector2 a, const float &n)
{
a *= n;
return a;
}
inline float operator*(const Vector2 &a, const Vector2 &b)
{
return (a.x * b.x) + (a.y * b.y);
}
inline Vector2 rotate(const Vector2 &a, const float &angle)
{
Vector2 out = a;
out *= cos(angle);
out.x -= sin(angle) * a.y;
out.y += sin(angle) * a.x;
return out;
}
(Обратите внимание, что я опустил вычитание, а другой оператор умножения, так как они были эквивалентны другим операторам, перечисленных здесь).
В настоящее время я не могу поверить в какие-либо улучшения. Я пропустил что-нибудь, что (потенциально) сделает эти функции, как они сейчас стоят, неэффективными?
Есть ли у вас какие-либо предложения о том, где можно получить систему профилирования или как ее использовать? Если это помогает, я в настоящее время работаю с Visual Studio 10 (Ultimate). (Кроме того, ваш предыдущий код не совпадает с тем, что я использовал, требуется копия, потому что нам нужно сохранить исходные элементы из a, даже после того, как мы * = by cos (angle). Если я не пропущу что-то, что вы знаете.) Спасибо! – Serge
@StefanZuefeldt код эквивалентен, вы можете проверить его. 'a' не изменяется, потому что вы передаете значение. Что касается профилирования, я ничего не знаю о VS. Я использовал gprof и valgrind для unix, плюс множество ручных тестов для профилирования. – juanchopanza
@StefanZuefeldt Visual Studio 2010 Ultimate имеет встроенный профайлер. –