编译器优化VS 2010中的返回值

时间:2012-04-09 01:05:50

标签: c++ optimization inline compiler-optimization return-value-optimization

使用VS 2010进行全面优化/ Ox查看以下两个函数调用:

static string test1(const string& input)
{
    return input;
}

static void test2(const string& input, string& output)
{
    output = input;
}

如果我使用后一个test2,那么函数总是被优化掉并且内联代码。但是,除非我关闭异常,否则不会内联test1。有人知道为什么吗?

此外,我希望编译器能够在test1中作为test2的高效工作,如果它使用返回值优化,但它似乎没有这样做。这也令我感到困惑。

我想使用第一个函数签名的原因是我有两个可编译的函数版本。我希望调用代码始终调用test1,并且当设置某个编译标志时,我希望它将输入附加到副本并返回它,当未设置编译标志时我希望它接近于否 - 尽可能。

2 个答案:

答案 0 :(得分:8)

Visual Studio无法内联返回具有非平凡析构函数的对象的函数:

在某些情况下,编译器不会出于机械原因内联特定函数。例如,编译器不会内联:
  • 一个函数,如果它会导致混合SEH和C ++ EH。
  • 当-GX / EHs / EHa打开时,带有复制构造对象的某些函数通过值传递。
  • 当-GX / EHs / EHa打开时,按值返回可解除对象的函数。
  • 在不使用-Og / Ox / O1 / O2进行编译时使用内联汇编的函数。
  • 具有可变参数列表的函数。
  • 带有try(C ++异常处理)语句的函数。

http://msdn.microsoft.com/en-us/library/a98sb923.aspx

答案 1 :(得分:2)

当返回值是函数的参数(12.8 / 31)时,标准明确禁止编译器使用返回值优化:

  

在下列情况下(可以合并以消除多份副本),允许复制/移动操作(称为复制省略)的省略:

     

- 在具有类返回类型的函数的return语句中,当表达式是非易失性自动对象(除函数或catch子句参数)的名称时,与函数返回类型相同的cv-unqualified类型,通过将自动对象直接构造为函数的返回值,可以省略复制/移动操作

     

- ...