[英]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。
当返回值是 function (12.8/31) 的参数时,该标准明确禁止编译器使用返回值优化:
这种复制/移动操作的省略,称为复制省略,在以下情况下是允许的(可以组合起来消除多个副本):
— 在具有 class 返回类型的 function 中的 return 语句中,当表达式是非易失性自动 object 的名称( function 或 catch 子句参数除外)具有与 function 返回类型相同的 cv-unqualified 类型,可以通过将自动 object 直接构造到函数的返回值中来省略复制/移动操作
——……
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.