Вероятность названного RVO? - PullRequest
3 голосов
/ 17 августа 2010

У меня есть функция, которая выглядит следующим образом:

// Fetch 1 MB of data
void GetData(std::vector<char> & outData);

1 МБ преувеличено, но я просто хочу подчеркнуть, что желательно избегать ненужных копий.

Если ядобавьте эту перегрузку:

std::vector<char> GetData()
{
    std::vector<char> result;
    GetData(result);
    return result;
}

Тогда насколько вероятно, что RVO вступит в действие?

Ответы [ 5 ]

7 голосов
/ 17 августа 2010

С большинством сравнительно недавних компиляторов (например, VS 2005 или новее, gcc 3.4 или новее) это, по сути, точно. Я говорю только «большинство», потому что я не проверял каждый существующий компилятор. Каждый новый компилятор, на который я смотрел в последние 5 лет или около того, включал его.

3 голосов
/ 17 августа 2010

RVO, скорее всего, вступит в силу, поскольку это довольно простая оптимизация, которая была доступна довольно давно.Тем не менее, для того, чтобы придать этому коду реальную практическую ценность даже в умеренно высокопроизводительном коде, вам понадобится NRVO.NRVO сложнее встретить, так как он относительно новый.Пока что это доступно.Компилятор MS, например, реализует его начиная с VS2005.

2 голосов
/ 17 августа 2010

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

Если вы хотите реализовать это для удобства, почему бы просто не попробовать свой компилятор (-ы) и либо посмотреть на сборку, либо профилировать ее и посмотреть, что произойдет? Эмпирические данные о том, что на самом деле делает ваш компилятор, вероятно, лучше, чем угадывать, что могут или не могут делать некоторые компиляторы.

0 голосов
/ 17 августа 2010

Также обратите внимание, что когда вы говорите:

std::vector<char> GetData() 
{ 
//   :
    return result; 
}

vector<char> x = GetData();

В вызываемом объекте result копируется в «возвращаемое значение», а затем в вызывающем устройстве «возвращаемое значение» копируется вx.NRVO может избавиться от одной из этих копий, но не от обеих.Компилятор обязан вызывать копию ctor хотя бы один раз, потому что он должен предполагать, что копия ctor имеет побочные эффекты, которые должны быть выполнены.

0 голосов
/ 17 августа 2010

Тогда какова вероятность того, что RVO вступит в действие?

Думать нужно программисту, а не компилятору.

Компиляторы обычно оптимизированы для созданияхороший код работает хорошо - не плохой.

Лично я использую первую форму.Обычно с указателем вместо ссылки - чтобы подчеркнуть тот факт, что параметр является выходным, а не входным.

...