在昨天的一个编程面试中,我不得不写的一个程序最终都是这样的:
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,它们便会更便宜.最不受欢迎的编译器.