Что происходит в стеке, когда константная ссылка привязана к временной?

Стандарт C ++ позволяет связывать константные ссылки с r-значениями, тем самым продлевая время жизни временного до тех пор, пока ссылка не выйдет из области видимости. Однако я не могу понять, как это на самом деле скомпилировано, позвольте мне объяснить на примере:

std::string foo() {
return std::string("foo");
}

void bar() {
VeryBigObject obj;
// Perhaps do something with the big object
}

int main(int, char **) {
const std::string &foo_str = foo();
bar();
return 0;
}

Насколько я знаю, используя архитектуру x86 в качестве примера, происходит то, что сначала функция foo() вызывается, и строковый объект создается в стеке, что означает, что необходимое количество пространства вычитается из rsp регистр (при условии 64-битной архитектуры); впоследствии rsp регистр возвращается к своему первоначальному значению, освобождая пространство стека, что функция foo() был наполнением, и, если я правильно понимаю, призыв к bar() будет использовать это пространство стека для построения VeryBigObject, который переписал бы строку.

Учитывая все это, как можно продлить время жизни строки после вызова foo() в домене сборки?

4

Решение

Временное возвращаемое значение будет построено в кадре стека mainлибо путем копирования / перемещения временного foo или, более вероятно, используя RVO для исключения копии и создания ее непосредственно в кадре вызывающего.

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

6

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