Стандарт 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()
в домене сборки?
Временное возвращаемое значение будет построено в кадре стека main
либо путем копирования / перемещения временного foo
или, более вероятно, используя RVO для исключения копии и создания ее непосредственно в кадре вызывающего.
После привязки к ссылке временный будет жить столько же, сколько и ссылка. По сути, временное управление управляется точно так же, как и именованная переменная с той же областью действия.