如何检查C++副本椭圆

Ste*_*eve 4 c++ optimization

我 在C++中遇到了关于复制椭圆的这篇文章,我在boost库中看到过关于它的评论.这很有吸引力,因为我更喜欢我的功能

verylargereturntype DoSomething(...)
Run Code Online (Sandbox Code Playgroud)

而不是

void DoSomething(..., verylargereturntype& retval)
Run Code Online (Sandbox Code Playgroud)

所以,我有两个问题

  1. 谷歌几乎没有这方面的文件,这有多真实?
  2. 如何检查此优化是否确实发生?我认为这涉及到看装配,但我只想说这不是我的强项.如果有人能给出一个非常基本的例子,说明成功的椭圆形是什么样的,那将是非常有用的

我不会仅仅使用复制椭圆来美化事物,但如果能保证它能够起作用,那么它听起来非常有用.

Mic*_*urr 9

我认为这是一个非常普遍应用的优化,因为:

  1. 编译器不难做到
  2. 这可能是一个巨大的收获
  3. 它是C++的一个领域,在优化变得普遍之前,这是一个常见的批评

如果您只是好奇,请printf()在您的复制构造函数中进行调试:

class foo {
public:
    foo(): x(0) {};

    foo(int x_) : x( x_) {};

    foo( foo const& other) : x( other.x) {
        printf( "copied a foo\n");
    };

    static foo foobar() {
        foo tmp( 2);

        return tmp;
    }


private:
    int x;
};



int main()
{
    foo myFoo;

    myFoo = foo::foobar();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行未经优化的构建时,打印出"复制了一个foo",但在构建优化时没有任何内容.

  • 该标准明确允许这种优化,因此它的长短不应该是你不应该依赖于复制构造函数的副作用,超出显而易见的范围.这是一个非常重要的优化技术,并且将其限制为具有普通复制构造函数的对象将是非常有限的. (2认同)
  • @sblom:正如Dennis所说,标准明确指出(12.8/12"复制类对象"):"当满足某些条件时,允许实现省略类对象的复制结构,即使复制构造函数和/或对象的析构函数有副作用" (2认同)

msw*_*msw 5

从你引用的文章:

虽然标准从不需要复制省略,但我测试的每个编译器的最新版本今天都会执行这些优化.但是,即使您觉得按重要值返回重量级对象也感觉不舒服,复制省略仍然会改变您编写代码的方式.

它更好地称为返回值优化.