Лучший способ реализовать арифметические перегрузки операторов с n-мерным векторным классом C ++? - PullRequest
2 голосов
/ 25 декабря 2011

У меня есть собственный математический класс Vector, который я использую в своем коде. У меня появилась новая необходимость обобщить мой векторный класс на n измерений вместо двух.

Мой вопрос: каков наилучший способ реализации перегрузок оператора, и есть ли значительные издержки для этого?

Теперь я храню значения в массиве

double *vals;
....
vals = new double[dimension];

Теперь я использую оператор + следующим образом:

Vector Vector::operator+(Vector v) 
{
    Vector ret = Vector(dimension);
    for (int i = 0; i < dimension; i ++)
    {
        ret.vals[i] = vals[i] + v.vals[i];
    }
}

Эта операция будет выполнена МНОГО и должна выполняться быстро. Это значительно хуже, чем старая версия (по скорости)?

Vector Vector::operator+(Vector v) {
    return Vector(x + v.x, y + v.y);
}

Спасибо за любой вклад!

Ответы [ 2 ]

1 голос
/ 25 декабря 2011

Если вам нужен быстрый векторный класс, используйте шаблоны для размера:

template<std::size_t size>
class Vector {
  double data[size];
public:
  double& operator[](std::size_t x) { return data[x]; }
};

template<std::size_t size>
Vector<size> operator+(Vector<size> lhs, const Vector<size>& rhs) {
  for (std::size_t i = 0; i < size; ++i)
    lhs[i] += rhs[i];
  return lhs;
}

Наличие динамического размера не требуется, только если вы хотите изменить их размер или если они невероятно велики.

Есть способы получить намного быстрее, например SSE.Вы должны использовать специальную математическую библиотеку, если вы хотите что-то высоко оптимизированное.

1 голос
/ 25 декабря 2011

Во-первых, я бы предложил передавать ваш операнд по ссылке вместо значения, чтобы избежать ненужной копии объекта:

Vector Vector::operator+(const Vector &v) {

Во-вторых, большинство компиляторов реализуют Оптимизация возвращаемого значения, который поможет устранить локальный ret в вашей многомерной реализации.

Конечно, наилучший подход - это реализовать ваш код, сравнить его, а затем применить оптимизацию, гденеобходимо. Effective C ++ Скотта Мейерса - отличный справочник для того, что вы пытаетесь сделать здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...