是否可以确保复制省略?

| 复制省略是一种巧妙的优化技术,在某些情况下,依赖复制省略实际上比“手动”传递引用要快。 因此,假设您已经确定了一个关键代码路径,在该代码路径上,您依靠编译器执行复制省略来获得最大性能的代码路径。 但是现在您依赖于编译器优化。 是否有任何(显然是特定于编译器的)方式来确保实际执行复制清除,并且如果无法执行复制清除,则使编译器(或其他工具)生成警告/错误? (我想到的是与Visual C ++的ѭ0远程相似的东西,如果编译器未内嵌由此标记的函数,它将产生警告。)     
已邀请:
除了在复制构造函数中添加ѭ1之外,其他操作并非如此。 否则,请使用您喜欢的分析器来衡量应用程序有趣的部分是否足够快。     
没有。 但是您可以编写等效的代码,尽管完全不可读:
BigObj f()
{
    BigObj x(g());
    x.someMethod();
    return x;
}

//...
BigObj z = f();
//...
被翻译(带复制省略)为:
void f(BigObj* obj)
{
    new(obj) BigObj(g());
    obj->someMethod();
}

//...
char z[sizeof(BigObj)];
f((BigObj*)&z[0]);
//...
((BigObj*)&z[0])->~BigObj();
但是,认真地讲,只需以使编译器可以删除副本的方式编写代码即可。即仅返回一个对象而不分支:
BigObj f()
{
    BigObj x, y;
    // use x and y
    if(condition)
        return x;
    else
        return y;
    // cannot be elided
}


BigObj f()
{
    if(condition)
    {
        BigObj x;
        return x;
    }
    else
    {
        BigObj y;
        return y;
    }
    // can be elided
}
    
在C ++ 1z(预期于2017年)中,将需要某些情况来保证复制省略: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html 根据公共cppreference.com编译器功能的支持,请确保Wiki GCC 7+和Clang 4+。 幸运的是,此优化方面不需要启用更新的语言支持,因为它是纯优化(遵循较旧的语言标准允许)。 另外,当应用优化时,如果使复制构造函数不可用,则可能需要在编译过程中启用较新的语言标准,或者使用不要求严格一致性的松散或扩展模式(例如,可能使用GCC的
-fpermissive
) 。     

要回复问题请先登录注册