如果我在我的函数中 return a class,它存储在哪里?
if I return a class in my function, where does it store?
看看我的代码:
#include <iostream>
using namespace std;
class MyClass{
public:
char ch[50] = "abcd1234";
};
MyClass myFunction(){
MyClass myClass;
return myClass;
}
int main()
{
cout<<myFunction().ch;
return 0;
}
我不明白我的 return 值存储在哪里?它存储在堆栈中吗?在堆?在我的程序完成之前它是否保留在内存中?
如果它存储在堆栈中,我可以确保我的 class 值永远不会改变吗?
请解释这些return的机制。如果 returning 结构与 returning class?
不同
找到一个合理的位置来存储该值取决于实现。虽然它通常在堆栈上,但语言定义并不对其实际存储位置强加任何要求。返回值是一个临时对象,它在创建它的完整语句结束时被销毁;也就是说,它在调用 myFunction()
.
行末尾的 ;
处被销毁
当您在任何函数中创建一个对象时,它会在函数执行完成后立即销毁,就像在变量中一样。
但是,当您 return 来自函数的对象时,编译器首先在堆中创建该对象的本地实例,称为 unnamed_temporary 然后销毁您创建的对象。并复制unnamed_temporary随叫随到的内容。然后它也销毁了这个未命名的_temporary。
您创建的任何不使用关键字 new 的内容都将在堆栈中创建。
是的,你的变量 ch 的内容不会改变,除非你访问那个变量并自己改变它。
MyClass myClass;
存储在堆栈中。 myFunction()
退出后立即销毁。
当你return
它时,会在堆栈上创建一个副本。此副本一直存在到封闭表达式的末尾:cout << myFunction().ch;
请注意,如果您的编译器足够聪明,则根本不应创建第二个对象。相反,第一个对象将一直存在到封闭表达式的末尾。这叫做NRVO,命名return值优化。
另请注意,标准未定义 "stack"。但是在这种情况下,任何常见的实现都会使用堆栈。
if returning structure is different to returning class?
C++中没有结构;关键字 struct
创建 类。 class
和 struct
之间的唯一区别是默认成员访问权限,因此答案是 "no"。
myFunction返回的实例是临时的,当它停止有用时它就消失了,所以在cout <<...
之后它就不存在了。只需添加一个析构函数,您就会看到它何时被调用。
我能确定我的 class 值永远不会改变吗? 是什么意思?您获得实例的 副本。
返回结构与返回 class? 不同:struct 类似于 class 默认情况下都是 public,这是唯一的区别。
您的函数正在返回一个对象的副本。它将存储在内存中的堆栈中。
返回的对象。将存在直到该功能的范围。之后,它将被销毁。然后,您的表达式 cout<<function();
也将具有该对象的副本。由函数返回。在这个cout<<function();
表达式的运行之后IT将被完全销毁。
看看我的代码:
#include <iostream> using namespace std; class MyClass{ public: char ch[50] = "abcd1234"; }; MyClass myFunction(){ MyClass myClass; return myClass; } int main() { cout<<myFunction().ch; return 0; }
我不明白我的 return 值存储在哪里?它存储在堆栈中吗?在堆?在我的程序完成之前它是否保留在内存中?
如果它存储在堆栈中,我可以确保我的 class 值永远不会改变吗?
请解释这些return的机制。如果 returning 结构与 returning class?
不同找到一个合理的位置来存储该值取决于实现。虽然它通常在堆栈上,但语言定义并不对其实际存储位置强加任何要求。返回值是一个临时对象,它在创建它的完整语句结束时被销毁;也就是说,它在调用 myFunction()
.
;
处被销毁
当您在任何函数中创建一个对象时,它会在函数执行完成后立即销毁,就像在变量中一样。 但是,当您 return 来自函数的对象时,编译器首先在堆中创建该对象的本地实例,称为 unnamed_temporary 然后销毁您创建的对象。并复制unnamed_temporary随叫随到的内容。然后它也销毁了这个未命名的_temporary。 您创建的任何不使用关键字 new 的内容都将在堆栈中创建。 是的,你的变量 ch 的内容不会改变,除非你访问那个变量并自己改变它。
MyClass myClass;
存储在堆栈中。 myFunction()
退出后立即销毁。
当你return
它时,会在堆栈上创建一个副本。此副本一直存在到封闭表达式的末尾:cout << myFunction().ch;
请注意,如果您的编译器足够聪明,则根本不应创建第二个对象。相反,第一个对象将一直存在到封闭表达式的末尾。这叫做NRVO,命名return值优化。
另请注意,标准未定义 "stack"。但是在这种情况下,任何常见的实现都会使用堆栈。
if returning structure is different to returning class?
C++中没有结构;关键字 struct
创建 类。 class
和 struct
之间的唯一区别是默认成员访问权限,因此答案是 "no"。
myFunction返回的实例是临时的,当它停止有用时它就消失了,所以在cout <<...
之后它就不存在了。只需添加一个析构函数,您就会看到它何时被调用。
我能确定我的 class 值永远不会改变吗? 是什么意思?您获得实例的 副本。
返回结构与返回 class? 不同:struct 类似于 class 默认情况下都是 public,这是唯一的区别。
您的函数正在返回一个对象的副本。它将存储在内存中的堆栈中。
返回的对象。将存在直到该功能的范围。之后,它将被销毁。然后,您的表达式 cout<<function();
也将具有该对象的副本。由函数返回。在这个cout<<function();
表达式的运行之后IT将被完全销毁。