Полный пример (N) RVO

Я читал о (N) RVO и хотел бы одно, полное описание сценария. Я надеюсь, что этот вопрос послужит другим учителям C ++ для разъяснения их идей.

Предположим, этот сценарий:

string get_string() {
string x("racecar");
//work on x...
return x;
}

string a( get_string() );
string b = get_string();

Пожалуйста, не обращайте внимания на семантику перемещения C ++ 11.

  • Если не выполняется (N) RVO, сколько будет конструкторов / присваиваний / деструкторов
    казнят? (укажите, к каким объектам они относятся)
  • Что изменится, если (N) RVO применяется?
  • Наконец, как ситуация меняется в C ++ 11, если предположить, что std::string опоры
    въезд семантики.

6

Решение

1) Внутри get_stringодин строковый объект (x) будет построен с использованием конструктора, который принимает const char*,

2) Когда функция вернется, созданная внутри строка будет скопирована во временный строковый объект в пространстве вызывающего.

3) Временная копия будет создана для a,

4) Смотри 1

5) Смотри 2

6) См. 3, но копия перейдет к b

С помощью RVO 2 и 5 можно устранить, создав временную функцию внутри функции через невидимую ссылку. С дальнейшим удалением копии (не RVO), 3 и 6 могут быть устранены. Так что у нас остается 2 конструкции, обе с использованием const char* конструктор.

С семантикой перемещения C ++ 11 ситуация вообще не меняется, если компилятор был достаточно хорош, чтобы выполнить все операции копирования. Если удаление копии не выполнено, то 2, 3, 5 и 6 все еще существуют, но становятся движениями вместо копий. В отличие от копирования, эти шаги не являются дополнительной оптимизацией. Соответствующий компилятор должен выполнить их, предполагая, что он еще не выполнил копирование.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]