繁体   English   中英

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

[英]compiler optimization of return value in VS 2010

使用完全优化/Ox 的 VS 2010 查看以下两个 function 调用:

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

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

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

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

我想使用第一个 function 签名的原因是我有两个 function 的可编译版本。我想让调用代码始终调用 test1,当设置了某个编译标志时,我希望它成为 append 副本的输入并返回它,当未设置编译标志时,我希望它尽可能接近空操作。

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

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

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

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

这种复制/移动操作的省略,称为复制省略,在以下情况下是允许的(可以组合起来消除多个副本):

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

——……

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM