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

And*_*ron 10 c++ return-value-optimization

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

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?

Bo *_*son 7

不,使用的类型不应影响优化.

我看到使用指针的唯一原因是,如果编译器使RVO失败,它们的复制成本会更低.不太可能与最流行的编译器.