10

在我昨天的一次编程面试中,我必须编写的一个程序最终得到了这样的结果:

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?

4

1 回答 1

7

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

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

于 2012-04-06T19:23:32.810 回答