Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2013, 23:51   #1
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
Вопрос Performance Penalty

В общем виде есть такой код.
Код:
Vector4 f;
f += f * 2.0f;
Мне хочется узнать в каком случае я получу максимально быстрое исполнение оператора +=

1. В случае если я определю его в описании вектора ?

Код:
struct Vector4 
{
	float x, y, z, w;
	Vector4();
	Vector4(float _x, float _y, float _z, float _w);
	Vector4(const Vector2 &v);
	Vector4(const Vector3 &v);
	Vector4(const Vector4 &v);

	Vector4& operator=( const float &f);
	Vector4& operator=( const Vector2 &v);
	Vector4& operator=( const Vector3 &v);
	Vector4& operator=( const Vector4 &v);

	void print() { printf("%f %f %f %f\n", x, y, z, w); };

	Vector4& operator+=(const Vector4 &v) { x += v.x; y += v.y; return *this; };

};
2. Или же глобальный оператор+= ?
Код:
//h
Vector4 operator+=( Vector4& a, Vector4& b );
//cpp
Vector4 operator+=( Vector4& a, Vector4& b ) 
{
	return Vector4 ( a.x += b.x, a.y += b.y, a.z += b.z, a.w += b.w );
};
В последнем случае мне кажется копирование вектора имеет место быть.
А в первом его вроде как нет. Так ли?
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 10.04.2013, 00:05   #2
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Первый будет побыстрее, да, вы правы, потому что во втором случае будет копирование вектора
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 10.04.2013, 00:43   #3
intmain
Играюсь с Python
Форумчанин
 
Аватар для intmain
 
Регистрация: 12.12.2012
Сообщений: 340
Лампочка

Спс, я подправил глобальный оператор.
Код:
//h
Vector4& operator+=( Vector4& a, Vector4& b );
//cpp
Vector4& operator+=( Vector4& a, Vector4& b ) 
{
  a.x +=b.x;
  a.y +=b.y;
  a.z +=b.z;
  a.w +=b.w;
	return a
};
думаю теперь особой разницы нет.
Что ел то - в долг, что жил то - зря.
Для избранных. ))
Секретные разработки
intmain вне форума Ответить с цитированием
Старый 10.04.2013, 02:27   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от intmain Посмотреть сообщение
В общем виде есть такой код.
Код:
Vector4 f;
f += f * 2.0f;
Мне хочется узнать в каком случае я получу максимально быстрое исполнение оператора +=

1. В случае если я определю его в описании вектора ?

Код:
struct Vector4 
{
	float x, y, z, w;
	Vector4();
	Vector4(float _x, float _y, float _z, float _w);
	Vector4(const Vector2 &v);
	Vector4(const Vector3 &v);
	Vector4(const Vector4 &v);

	Vector4& operator=( const float &f);
	Vector4& operator=( const Vector2 &v);
	Vector4& operator=( const Vector3 &v);
	Vector4& operator=( const Vector4 &v);

	void print() { printf("%f %f %f %f\n", x, y, z, w); };

	Vector4& operator+=(const Vector4 &v) { x += v.x; y += v.y; return *this; };

};
2. Или же глобальный оператор+= ?
Код:
//h
Vector4 operator+=( Vector4& a, Vector4& b );
//cpp
Vector4 operator+=( Vector4& a, Vector4& b ) 
{
	return Vector4 ( a.x += b.x, a.y += b.y, a.z += b.z, a.w += b.w );
};
В последнем случае мне кажется копирование вектора имеет место быть.
А в первом его вроде как нет. Так ли?
Надо смотреть выхлоп компилятора.
Компиляторы нынче оч многие вещи научились оптимизировать.

Ну а так, лично я руководствуюсь двумя правилами:

1. Методы определенные в декларации класса по дефолту инлайнятся.
Что означает, что теоретически, такие методы работают быстрее, чем те, что ты выносишь из туловища класса в спп файл.

2.
Код:
 Vector4 operator+=( Vector4& a, Vector4& b ) 
{
	return Vector4 ( a.x += b.x, a.y += b.y, a.z += b.z, a.w += b.w );
};
[/CODE]

Гугли RVO RNVO

Если вкратце, то компиляторы по стандарту обязаны уметь (и они это умеют) оптимизировать такие конструкции. В релиз версии никаких лишьних копирований не будет.

в 11 стандарте вообще move-семантика появилась.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование Performance Data Helper Blade Общие вопросы C/C++ 3 12.10.2009 23:17
C++ PDH (Performance Data Helper) PMike Помощь студентам 2 15.04.2009 16:05