相关疑难解决方法(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万
查看次数

保证副本省略如何运作?

在2016年奥卢ISO C++标准会议上,标准委员会将一项名为" 保证副本省略"的提案通过简化的价值类别投票进入C++ 17.

保证副本省略如何运作?是否涵盖了某些已经允许复制省略的情况,或者是否需要更改代码来保证复制省略?

c++ copy-elision c++17

75
推荐指数
1
解决办法
7883
查看次数

使用"return"语句避免对象的副本

我在C++中有一个非常基本的问题.返回对象时如何避免复制?

这是一个例子:

std::vector<unsigned int> test(const unsigned int n)
{
    std::vector<unsigned int> x;
    for (unsigned int i = 0; i < n; ++i) {
        x.push_back(i);
    }
    return x;
}
Run Code Online (Sandbox Code Playgroud)

据我了解C++是如何工作的,这个函数将创建2个向量:本地一个(x),以及将返回的x的副本.有没有办法避免副本?(我不想返回指向对象的指针,但是对象本身)


使用"移动语义"(在评论中说明)该函数的语法是什么?

c++ copy return object return-value

34
推荐指数
3
解决办法
2万
查看次数

RVO,用于C++中复杂的用户定义类型

在昨天的编程采访中,我必须写的一个程序最终得到了这样的结论:

struct Blob
{
    // basic field containing image blob statistics.
};

std::vector<Blob> find_blobs (const Image& ...)
{
    std::vector<Blob> blobs;
    // ...
    return blobs;
}
Run Code Online (Sandbox Code Playgroud)

我熟悉返回值优化(RVO),所以我刚才提到返回向量不会导致流行编译器上的副本(有一个返回语句作为最后一行,并且没有控制路径可以返回另一个对象)我写的代码).

但是,面试官告诉我,由于Blob可能是一个复杂的用户定义类型(UDT),编译器可能无法执行RVO.他进一步补充说,返回a std::vector<Blob*>将增加编译器执行复制省略的机会.

据我所知,编译器执行RVO的能力与返回的对象类型完全无关,除非是非可复制对象,编译器将(应该?)拒绝代码,即使生成的代码也是如此无需调用复制构造函数即可编译.

那么,面试官是对的吗?复杂的返回类型是否会阻止编译器应用RVO?

c++ return-value-optimization

10
推荐指数
1
解决办法
316
查看次数