小编ala*_*rge的帖子

现代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万
查看次数

在结构阵列(AoS)和阵列结构(SoA)之间来回切换

在许多关于面向数据的设计的着作中起着突出作用的一个特征是,在很多情况下,而不是AoS(结构数组):

struct C_AoS {
  int    foo;
  double bar;
};

std::vector<C_AoS> cs;
...
std::cout << cs[42].foo << std::endl;
Run Code Online (Sandbox Code Playgroud)

在SoA(数组结构)中安排一个数据更有效:

struct C_SoA {
  std::vector<int>    foo;
  std::vector<double> bar;
};

C_SoA cs;
...
std::cout << cs.foo[42] << std::endl;
Run Code Online (Sandbox Code Playgroud)

现在我正在寻找的是一个解决方案,它允许我在不改变调用接口的情况下在AoS和SoA之间切换,即我可以用最小的努力并且没有额外的运行时成本(至少到了过度的间接点),cs[42].foo;无论我正在使用哪种数据排列,都要调用.

我应该注意上面的示例语法是理想的情况,这可能是不可能的,但我也对近似近似非常感兴趣.任何接受者?

c++ data-oriented-design c++11 c++14

9
推荐指数
1
解决办法
1062
查看次数