Вопрос: где временный объект, выделенный при возврате значением? I.e., в стеке, в динамически распределенной памяти - что делают компиляторы в таких случаях?Если объект, возвращаемый значением, назначен
Я рыть глубоко в основной логики в ход конструктора идиомы в C++ 03, как описано в More C++ Idioms/Move Constructor, и интересная часть, как возвращается объект:
struct foo {
int values[100];
...
};
foo func() {
foo ret;
... // assign value to ret
return ret;
}
int main() {
foo a(func());
...
return 0;
}
точки между return ret;
и a(func)
явно содержит очистку стека и дальнейшую конструкцию копирования, но где хранится временный объект, прежде чем он будет передан в конструктор копирования? Возможно, я наблюдал за ответом в результатах поиска, но до сих пор не могу найти объяснения.
EDIT:
Хорошо, пример может показаться слишком простым. В реальных приложениях, мы могли бы написать что-то вроде этого:
class Command {
public:
Command();
Command(const Command &);
...
private:
CommandResponseType mResponseType;
quint64 mId;
QString mName;
quint16 mTypeCode;
QDateTime mDatetime;
TParamList mParams;
};
Такой класс не POD, и компилятор, вероятно, не для оптимизации копирования конструкции Command a(someInstanceOfOtherClass.getCommand("foo"));
просто выделяя значение на стеке. По крайней мере, задействуется копирование построений QString, QDateTime и TParamList.
Если я правильно понимаю, getCommand()
имеет соглашение о созыве, которое обязывает вызывающего абонента самостоятельно очищать стек. Логическое решение состоит в том, чтобы выделить результат в памяти, вернуть указатель. Я попробую разные сценарии и посмотрю на сборку.
Стандарт делает не говорите, где должен быть выделен этот объект, оставив его компилятору для принятия решения о реализации. Разработчики компилятора могли бы принять решение о возврате возвращаемого значения различными способами - от использования регистров, когда объект подходит в них, к использованию стека, чтобы потребовать, чтобы вызывающий передал ссылку на объект, в который должно быть скопировано возвращаемое значение. – dasblinkenlight
@dasblinkenlight (и стандарт даже не связан с такими вещами, как «стек» или «куча».) –
Именно поэтому я спросил о таких зависимых от компилятора функциях. «Требование, чтобы вызывающая сторона передавала ссылку на объект, в который должно быть скопирована возвращаемое значение», является для меня чем-то новым. –