这两个函数之间创建的临时对象的数量是否存在差异?
string foo1() {
return "";
}
string foo2() {
string s = "";
return s;
}
这是一个家庭作业问题,所以请假设没有编译器优化。
这两个函数之间创建的临时对象的数量是否存在差异?
string foo1() {
return "";
}
string foo2() {
string s = "";
return s;
}
这是一个家庭作业问题,所以请假设没有编译器优化。
不——只创建一个临时的。函数堆栈上的对象不是临时的,它是一个左值。字符串文字也是一个左值。两者都涉及完全相同的过程-返回从左值构造的字符串。
是的。如果没有任何优化,即 NRVO(命名为返回值优化),第二个代码将产生 2 个临时代码,而第一个代码将产生一个。
没有不同。在这两种情况下,都会创建一个新的字符串对象(1 - 隐式,2 - 显式)。
两个示例都执行以下操作: 1. 将空字符串的指针压入堆栈(或将其写入寄存器)。2. 创建字符串类的新实例(使用指定的字符串)。3. 将新建实例的指针写入 EAX(结果)
抱歉,这是 C++ 问题,而我想到了 C# :)
这意味着字符串类的实例将被复制(不是由指针返回)。无论如何,这两个示例都只创建了一个字符串类的实例(1 - 隐式,2 - 显式),然后这个实例(临时对象)的所有字节将作为结果被推入堆栈。
答案:没有区别,只有一个临时对象(前提是没有应用编译器优化)。
注意:在这两种情况下,编译器都会在堆栈中分配相同数量的字节来存储字符串类的实例,并且“”(空字符串)已经加载到内存中(没有分配)。唯一的区别是第一个示例隐式创建了字符串类的实例。