问题是:按值返回时,临时对象分配在哪里?即,在堆栈上,在动态分配的内存中——在这种情况下编译器会做什么?
如More C++ Idioms/Move Constructor中所述,我正在深入研究 C++03 中移动构造函数习语中的底层逻辑,有趣的部分是如何返回对象:
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)
显然包含堆栈清理和进一步的复制构造,但是临时对象在传递到复制构造函数之前存储在哪里?也许,我在搜索结果中监督了答案,但仍然找不到解释。
编辑:
好的,这个例子可能看起来过于简单了。在实际应用中,我们可以这样写:
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()
有__thiscall
调用约定,它要求被调用者自己清理堆栈。逻辑解决方案是将结果分配到内存中并返回一个指针。我将尝试不同的场景并查看组装情况。