相关疑难解决方法(0)

现代C++可以免费获得性能吗?

有时声称即使仅编译C++ 98代码,C++ 11/14也可以提高性能.理由通常是移动语义,因为在某些情况下,rvalue构造函数是自动生成的,或者现在是STL的一部分.现在我想知道这些案例以前是否已经由RVO或类似的编译器优化处理过了.

那么我的问题是,如果你能给我一个C++ 98代码的实际例子,使用支持新语言特性的编译器,无需修改就可以更快地运行.我确实理解标准符合编译器不需要执行复制省略,因此移动语义可能会带来速度,但我希望看到一个较少病态的案例,如果你愿意的话.

编辑:为了清楚,我不是在问新的编译器是否比旧的编译器更快,而是如果有代码将-std = c ++ 14添加到我的编译器标志它会运行得更快(避免副本,但如果你除了移动语义之外还能提出其他任何东西,我也会感兴趣)

c++ performance move-semantics c++11 c++14

205
推荐指数
2
解决办法
1万
查看次数

可以在C++ 11/14中按值返回局部变量,导致在没有复制/移动时由rvalue构造返回值吗?

我知道在以下情况下编译器可以自由移动 - 构造返回值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,但我找不到任何这种例子或问题.

c++ c++11 c++14

32
推荐指数
1
解决办法
1893
查看次数

标签 统计

c++ ×2

c++11 ×2

c++14 ×2

move-semantics ×1

performance ×1