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

前端之家收集整理的这篇文章主要介绍了C中的复杂用户定义类型的RVO前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在昨天的一个编程面试中,我不得不写的一个程序最终都是这样的:
struct Blob
{
    // basic field containing image blob statistics.
};

std::vector<Blob> find_blobs (const Image& ...)
{
    std::vector<Blob> blobs;
    // ...
    return blobs;
}

我熟悉return value optimization(RVO),所以我刚才提到返回向量不会在流行的编译器上造成一个副本(有一个返回语句作为最后一行,没有控制路径可以在代码中返回另一个对象写).

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

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

那么面试官是对的吗?一个复杂的返回类型可以阻止编译器应用RVO吗?

解决方法

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

我看到使用指针的唯一原因是,如果编译器失败了RVO,它们便会更便宜.最不受欢迎的编译器.

猜你在找的C&C++相关文章