1

这两个函数之间创建的临时对象的数量是否存在差异?

string foo1() {
    return "";
} 

string foo2() {
    string s = "";
    return s;
}

这是一个家庭作业问题,所以请假设没有编译器优化。

4

3 回答 3

6

不——只创建一个临时的。函数堆栈上的对象不是临时的,它是一个左值。字符串文字也是一个左值。两者都涉及完全相同的过程-返回从左值构造的字符串。

于 2011-06-12T15:58:09.913 回答
3

是的。如果没有任何优化,即 NRVO(命名为返回值优化),第二个代码将产生 2 个临时代码,而第一个代码将产生一个。

于 2011-06-12T15:34:19.127 回答
-2

没有不同。在这两种情况下,都会创建一个新的字符串对象(1 - 隐式,2 - 显式)。


两个示例都执行以下操作: 1. 将空字符串的指针压入堆栈(或将其写入寄存器)。2. 创建字符串类的新实例(使用指定的字符串)。3. 将新建实例的指针写入 EAX(结果)


抱歉,这是 C++ 问题,而我想到了 C# :)

这意味着字符串类的实例将被复制(不是由指针返回)。无论如何,这两个示例都只创建了一个字符串类的实例(1 - 隐式,2 - 显式),然后这个实例(临时对象)的所有字节将作为结果被推入堆栈。

答案:没有区别,只有一个临时对象(前提是没有应用编译器优化)。

注意:在这两种情况下,编译器都会在堆栈中分配相同数量的字节来存储字符串类的实例,并且“”(空字符串)已经加载到内存中(没有分配)。唯一的区别是第一个示例隐式创建了字符串类的实例。

于 2011-06-12T15:35:07.487 回答