有时声称即使仅编译C++ 98代码,C++ 11/14也可以提高性能.理由通常是移动语义,因为在某些情况下,rvalue构造函数是自动生成的,或者现在是STL的一部分.现在我想知道这些案例以前是否已经由RVO或类似的编译器优化处理过了.
那么我的问题是,如果你能给我一个C++ 98代码的实际例子,使用支持新语言特性的编译器,无需修改就可以更快地运行.我确实理解标准符合编译器不需要执行复制省略,因此移动语义可能会带来速度,但我希望看到一个较少病态的案例,如果你愿意的话.
编辑:为了清楚,我不是在问新的编译器是否比旧的编译器更快,而是如果有代码将-std = c ++ 14添加到我的编译器标志它会运行得更快(避免副本,但如果你除了移动语义之外还能提出其他任何东西,我也会感兴趣)
我知道在以下情况下编译器可以自由移动 - 构造返回值makeA(但也可以自由地删除副本或完全移动):
struct A
{
A(A&);
A(A&&);
};
A makeA()
{
A localA;
return localA;
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否允许编译器通过rvalue引用A从类型的本地对象构造类型的对象(B如果它是在return语句中构造的).换句话说,在下面的例子中,是否允许编译器A为返回值选择构造函数4?
struct B { };
struct A {
A(A&); // (1)
A(A&&); // (2)
A(B&); // (3)
A(B&&); // (4)
};
A makeA()
{
B localB;
return localB;
}
Run Code Online (Sandbox Code Playgroud)
我问这个是因为在我看来,允许类型的本地对象A在return语句中被视为rvalue 的相同逻辑也应该允许任何类型的本地被视为rvalue,但我找不到任何这种例子或问题.