在我昨天的一次编程面试中,我必须编写的一个程序最终得到了这样的结果:
struct Blob
{
// basic field containing image blob statistics.
};
std::vector<Blob> find_blobs (const Image& ...)
{
std::vector<Blob> blobs;
// ...
return blobs;
}
我对返回值优化(RVO)很熟悉,所以我刚刚提到返回向量不会导致流行编译器上的副本(最后一行有一个返回语句,并且没有控制路径可以返回另一个对象我写的代码)。
但是,面试官告诉我,由于Blob
可能是复杂的用户定义类型(UDT),编译器可能无法执行 RVO。他进一步补充说,返回 astd::vector<Blob*>
会增加编译器执行复制省略的机会。
据我所知,编译器执行 RVO 的能力与返回的对象的类型完全无关,除了不可复制的对象,编译器将(应该?)拒绝代码,即使结果代码无需调用复制构造函数就可以编译。
那么,面试官说的对吗?复杂的返回类型能否阻止编译器应用 RVO?