2017-01-20 3 views
0

Я использую C++. Я хочу, чтобы умножить матрицуМатричное умножение без копирования с помощью оператора *

class mat 
{ 
mat operator *(const mat& mA,const mat& mB) 
} 

Если РВО включен, то я буду иметь прямое использование значения, вычисленного в оператора * **. Но если RVO выключено, мне придется копировать объект. RVO не входит в стандарт. Я хочу быть уверенным, что каждый кондоминиум будет делать размножение, не справившись. Каким будет лучший способ избежать копирования объекта. Мой вопрос включает C++ 11,14.

Есть ли способ переписать * operator ** для умножения матриц без результата обработки, даже с RVO OFF.

+1

Почему бы вам когда-либо отключить РВО и скопировать Пропуска? Можете ли вы рассказать о конкретной проблеме, которая у вас есть? –

+0

Я хочу быть уверенным, что на каждом компиляторе поведение будет таким же. –

+1

Это вряд ли появится, каждый компилятор компилирует то, как его дизайнеры решили, единственное, что вам может потребоваться, это сохранение семантики. –

ответ

1

Если вы используете C++11, то почему бы не использовать Move constructors и Move assignment operator.

Конструктор движение вызывается всякий раз, когда выбирается разрешения перегрузки, что обычно происходит, когда объект инициализируется из RValue (xvalue или prvalue) одного и того же типа, в том числе

  • функции возврата по значению.

Таким образом, один из них может быть использован при условии, mat::x статически размещена int:

friend mat&& mat::operator*(const mat &a, const mat &b) 
{ 
    mat *c = new mat(); 
    c->x = a.x * b.x; 
    return std::move(*c); 
} 

friend mat mat::operator*(const mat &a, const mat &b) 
{ 
    mat c; 
    c.x = a.x * b.x; 
    return c; 
} 

обеспечивает также соответствующий move constructor и move assignment operator для class mat.

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

Вместо operator* использования:

void mat::Multiplication(const mat &a, const mat &b, mat &result); 
{ 
    result.x = a.x * b.x; 
} 
+0

Я просил об этом, но в случае с ссылкой на перемещение вы возвращаете ссылку rvalue на мат, я не очень хорошо разбираюсь в rvalie. не могли бы вы расширить код? –

+0

Фактически основная причина этого вопроса заключалась в использовании ссылки rvlue в этом случае. 1 от меня –

0

Ждать C++ 17, где RVO указано в некоторых случаях. Если вы не согласны с этим, посмотрите конкретные сведения о том, что гарантирует ваш компилятор (ы), который может быть больше, чем требуется для стандартного.

Смежные вопросы