相关疑难解决方法(0)

C++ 11 rvalues和移动语义混淆(return语句)

我试图理解rvalue引用并移动C++ 11的语义.

这些示例之间有什么区别,哪些不会执行矢量复制?

第一个例子

std::vector<int> return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return tmp;
}

std::vector<int> &&rval_ref = return_vector();
Run Code Online (Sandbox Code Playgroud)

第二个例子

std::vector<int>&& return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();
Run Code Online (Sandbox Code Playgroud)

第三个例子

std::vector<int> return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();
Run Code Online (Sandbox Code Playgroud)

c++ c++-faq rvalue-reference move-semantics c++11

415
推荐指数
3
解决办法
10万
查看次数

什么是复制省略和返回值优化?

什么是复制省略?什么是(命名)返回值优化?他们意味着什么?

它们会在什么情况下发生?有什么限制?

c++ optimization c++-faq return-value-optimization copy-elision

350
推荐指数
4
解决办法
7万
查看次数

为什么从函数返回向量是可以的?

请考虑此代码.我已经多次看过这种类型的代码了.words是一个本地向量.如何从函数中返回它?我们可以保证它不会死吗?

 std::vector<std::string> read_file(const std::string& path)
 {
    std::ifstream file("E:\\names.txt");

    if (!file.is_open())
    {
        std::cerr << "Unable to open file" << "\n";
        std::exit(-1);
    }

    std::vector<string> words;//this vector will be returned
    std::string token;

    while (std::getline(file, token, ','))
    {
        words.push_back(token);
    }

    return words;
}
Run Code Online (Sandbox Code Playgroud)

c++ scope stl vector standard-library

106
推荐指数
4
解决办法
13万
查看次数

C ++理解RVO(与返回局部变量引用相比)

这是我使用C ++并进行学习的第一年。我目前正在阅读“返回值优化”(我使用C ++ 11 btw)。例如在这里https://en.wikipedia.org/wiki/Return_value_optimization,立即想到这些具有原始类型的初学者示例:

int& func1()
{
    int i = 1;
    return i;
} 
//error, 'i' was declared with automatic storage (in practice on the stack(?)) 
//and is undefined by the time function returns 
Run Code Online (Sandbox Code Playgroud)

...还有这个:

int func1()
{
    int i = 1;
    return i;
}
//perfectly fine, 'i' is copied... (to previous stack frame... right?)
Run Code Online (Sandbox Code Playgroud)

现在,我开始尝试根据另外两个方面来理解它:

Simpleclass func1()
{
    return Simpleclass();
}
Run Code Online (Sandbox Code Playgroud)

这里实际发生了什么?编辑:我知道大多数编译器将优化此,我问的不是'if',而是:

  • 优化的工作方式(可接受的响应)
  • 它是否会影响存储时间:堆栈/堆(旧:我是从堆栈复制还是在堆上创建并移动(通过引用)基本上是随机的吗?这取决于创建的对象大小吗?
  • 使用显式std :: move更好吗?

非常感谢,

c++ c++11

4
推荐指数
1
解决办法
366
查看次数