变量在临时存储中存在多长时间?
How long does variable exist in temporary storage?
目前我正在通过 Steven Prata 和第 6 页的第 6 版 C++ Primer Plus 学习 C++。 389 我发现某事非常有趣,我想为自己澄清一下。
如果我们有这样的功能:
const std::string &ft_add_on_sides(std::string s1, std::string s2)
{
std::string res;
res = s2 + s1 + s2;
return (s2);
}
int main(void)
{
std::string input = "Hello"
std::string result = ft_add_on_sides(input, "###");
return (0);
}
据我了解,此函数需要两个字符串对象,它们将是程序员实际传递的 副本 。并且此函数将 return const 引用一些内存地址。
但我对 return 语句感兴趣:
由于 s1 或 s2 位于 临时存储 中,我们可以访问它们,但是当他们会被摧毁吗?这样的 return 声明不会惹上麻烦吗?
添加。因为变量可以被销毁,我还在询问它的地址。
您可以在此处阅读已接受的答案。
the return value is copied out of a local variable into the return register if necessary.
不再需要函数的栈帧,局部变量被弹出,一旦函数 returns 将无法访问,但 s2
将被复制到 return 注册.
一旦 return
语句执行,函数的参数就会在调用函数继续之前销毁。这意味着您仍然可以在 return
值表达式中使用这些参数,但是您最好 return 一个 copy 它们。
你在你的例子中写的是未定义的行为。任何事情都可能发生。通常,在调试模式下,编译器相当擅长捕获对已破坏字符串的访问,但在发布版本中,编译器不再引入代码来捕获错误。
目前我正在通过 Steven Prata 和第 6 页的第 6 版 C++ Primer Plus 学习 C++。 389 我发现某事非常有趣,我想为自己澄清一下。 如果我们有这样的功能:
const std::string &ft_add_on_sides(std::string s1, std::string s2)
{
std::string res;
res = s2 + s1 + s2;
return (s2);
}
int main(void)
{
std::string input = "Hello"
std::string result = ft_add_on_sides(input, "###");
return (0);
}
据我了解,此函数需要两个字符串对象,它们将是程序员实际传递的 副本 。并且此函数将 return const 引用一些内存地址。
但我对 return 语句感兴趣:
由于 s1 或 s2 位于 临时存储 中,我们可以访问它们,但是当他们会被摧毁吗?这样的 return 声明不会惹上麻烦吗?
添加。因为变量可以被销毁,我还在询问它的地址。
您可以在此处阅读已接受的答案。
the return value is copied out of a local variable into the return register if necessary.
不再需要函数的栈帧,局部变量被弹出,一旦函数 returns 将无法访问,但 s2
将被复制到 return 注册.
一旦 return
语句执行,函数的参数就会在调用函数继续之前销毁。这意味着您仍然可以在 return
值表达式中使用这些参数,但是您最好 return 一个 copy 它们。
你在你的例子中写的是未定义的行为。任何事情都可能发生。通常,在调试模式下,编译器相当擅长捕获对已破坏字符串的访问,但在发布版本中,编译器不再引入代码来捕获错误。