Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数返回值在形式上是什么意思?_C++_Function - Fatal编程技术网

C++ 函数返回值在形式上是什么意思?

C++ 函数返回值在形式上是什么意思?,c++,function,C++,Function,该标准指出,当函数返回值时,move构造函数是适用的。它不太清楚,因为我认为当函数返回一个值时,它会在函数执行时创建一个正在构造的临时对象。当然,可以按照复制省略过程的顺序省略move构造函数。但我想考虑的情况是: #include <iostream> struct X { int a = 42; X(); X(const X&&, int t = 24); }; X::X(){ } X::X(const X&&, in

该标准指出,当函数返回值时,move构造函数是适用的。它不太清楚,因为我认为当函数返回一个值时,它会在函数执行时创建一个正在构造的临时对象。当然,可以按照复制省略过程的顺序省略move构造函数。但我想考虑的情况是:

#include <iostream>

struct X
{
    int a = 42;
    X();
    X(const X&&, int t = 24);
};

X::X(){ }

X::X(const X&&, int g)
{
    std::cout << g << std::endl;
}

X foo()
{
    return X();
}

int main()
{
    foo(); //move-constructor called
}

当函数返回值时,内存中实际发生了什么?第一个示例和第二个示例之间是否存在显著差异?

当函数返回值时,它会创建一个临时对象。相当地可以使用移动构造函数初始化所述对象。矛盾在哪里?请注意,返回值优化RVO可以通过让返回对象的函数直接在返回对象的位置构造它来避免临时对象的复制/移动。第一个示例和第二个示例之间的显著区别是,在第一种情况下,move构造函数有一个副作用,您可以观察到它被调用。在第二种情况下,复制int不会产生任何明显的副作用。我想我不太明白这个问题。当一个函数返回一个值时,内存中到底发生了什么内存中不一定发生任何事情,在许多情况下,结果会出现在特定的CPU寄存器中。这就是如果应用任何优化,int foo{int a=5;return a;}函数可能会做的事情-将立即数值5加载到累加器CPU寄存器中。此链接可能会有所帮助-
int foo()
{ 
    int a = 5; 
    return a; 
}