Я читал о (N) RVO и хотел бы одно, полное описание сценария. Я надеюсь, что этот вопрос послужит другим учителям C ++ для разъяснения их идей.
Предположим, этот сценарий:
string get_string() {
string x("racecar");
//work on x...
return x;
}
string a( get_string() );
string b = get_string();
Пожалуйста, не обращайте внимания на семантику перемещения C ++ 11.
std::string
опоры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 все еще существуют, но становятся движениями вместо копий. В отличие от копирования, эти шаги не являются дополнительной оптимизацией. Соответствующий компилятор должен выполнить их, предполагая, что он еще не выполнил копирование.
Других решений пока нет …