使用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,并且当设置某个编译标志时,我希望它将输入附加到副本并返回它,当未设置编译标志时我希望它接近于否 - 尽可能。
答案 0 :(得分:8)
Visual Studio无法内联返回具有非平凡析构函数的对象的函数:
在某些情况下,编译器不会出于机械原因内联特定函数。例如,编译器不会内联:
- 一个函数,如果它会导致混合SEH和C ++ EH。
- 当-GX / EHs / EHa打开时,带有复制构造对象的某些函数通过值传递。
- 当-GX / EHs / EHa打开时,按值返回可解除对象的函数。
- 在不使用-Og / Ox / O1 / O2进行编译时使用内联汇编的函数。
- 具有可变参数列表的函数。
- 带有try(C ++异常处理)语句的函数。
答案 1 :(得分:2)
当返回值是函数的参数(12.8 / 31)时,标准明确禁止编译器使用返回值优化:
在下列情况下(可以合并以消除多份副本),允许复制/移动操作(称为复制省略)的省略:
- 在具有类返回类型的函数的return语句中,当表达式是非易失性自动对象(除函数或catch子句参数)的名称时,与函数返回类型相同的cv-unqualified类型,通过将自动对象直接构造为函数的返回值,可以省略复制/移动操作
- ...