ski*_*mon 6 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;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用后一个test2,那么函数总是被优化出来并且内联代码.但是,除非我关闭异常,否则不会内联test1.有人知道为什么吗?
另外,我希望编译器能够在test1中作为test2的高效工作,如果它使用返回值优化,但似乎没有这样做.这也令我感到困惑.
我想使用第一个函数签名的原因是我有两个可编译的函数版本.我希望调用代码始终调用test1,并且当设置某个编译标志时,我希望它将输入附加到副本并返回它,当未设置编译标志时我希望它接近于否 - 尽可能.
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