Что быстрее / эффективнее? - PullRequest
2 голосов
/ 17 мая 2011

В настоящее время изучает эффективность в C ++ и интересуется эффективностью возврата параметров в методы.

Представьте себе класс Vector3f с методом add.

Код первый:

Vector3f Vector3f::add(const Vector3f &rhs) const {
    Vector3f result;
    result.x(x() + rhs.x());
    result.y(y() + rhs.y());
    result.z(z() + rhs.z());
    return result;
}

Код второй:

Vector3f Vector3f::add(const Vector3f &rhs) const {
    return Vector3f(
                x() + rhs.x(),
                y() + rhs.y(),
                z() + rhs.z());
}

Я знаю, что второй сегмент кода более эффективен, и я надеялся, что кто-нибудь может дать мне окончательный ответ на вопрос, почему. Я уверен, что это как-то связано с временными объектами.

Ответы [ 3 ]

5 голосов
/ 17 мая 2011

Вероятно, это связано с оптимизацией возвращаемого значения (RVO). Поскольку вторая форма создает объект по мере его возврата, компилятору разрешается (и обычно будет) пропускать конструктор копирования, создавая объект непосредственно в контексте вызывающего.

Первая форма также может быть оптимизирована аналогичным образом, но я часто видел, как компиляторы оптимизируют последний, а не первый.

1 голос
/ 17 мая 2011

На самом деле, это больше связано с инициализацией: когда вы «строите по умолчанию», ваши Vector3f result члены x, y, z будут инициализированы. Вы не всегда контролируете стоимость этого, особенно с «тяжелыми» участниками.

Вызов конструктора со всеми значениями элементов позволяет объекту инициализировать его элементы право в первый раз .

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

class Vector3f {
   ...
   Vector3f& operator+=( const Vector3f& other ) {
      x += other.x;
      y += other.y;
      z += other.z;
      return *this;
   }
};

и используйте его как

Vector3f a( 1,2,3 );
a += Vector3f( 0,0,1 );
0 голосов
/ 18 мая 2011

Интересно, как работают компиляторы, но я полагаю, вы понимаете, что почти всегда есть "рыба, чтобы жарить" побольше.

Мне кажется, что многие люди получают свои идеи о производительности от учителей и авторов, которые не имели большого опыта работы с большим и реальным программным обеспечением. Я не знаю, как еще объяснить концентрацию на микропроблемах, и что люди, кажется, не знают, когда они угадывают , даже если догадки образованы.

Итак, FWIW, вот несколько общих представлений о производительности.

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