繁体   English   中英

对象数据成员的C ++连续内存访问

[英]C++ Contiguous memory access for object data members

我很好奇内存模型如何用于C ++类。 具体来说,是否可以保证对象的数据成员是连续分配的。 例如,如果我有以下代码:

class Particle {
public:
  Particle(double ix, double iy, double ivx, double ivy);
  // Omitted for brevity

private:
  double x;
  double y;
  double vx;
  double vy;
};

当我初始化一个对象时,数据成员将在内存中是连续的还是我更好(为了提高性能)执行以下操作:

class Particle {
public:
  Particle(double ix, double iy, double ivx, double ivy);
  // Omitted for brevity

private:
  std::array<double, 4> params
};

我来自Fortran和C编程领域,并且习惯于使用数组进行快速顺序内存访问,因此我很好奇当所有数据成员在任何调用上连续使用时,上述语义之一是否适合快速访问。

  • 该标准保证它们在内存中将按照该顺序排列
    (如果您选择了他们的地址,他们将会增加)。

  • 保证它们将在连续的内存中; 但是,如果那是最理想的布局,那么它们可能会是。 允许编译器在成员之间添加填充(通常这样做是为了提高访问效率(牺牲速度的空间))。 如果所有成员的大小相同,这是不可能的。

注意:在它们之间引入public / private / protected会使事情变得复杂,并且可能会更改顺序。

您是否最好使用数组?

那要看。 您通常会通过索引还是通过名称访问它们? 我会说,您拥有的第一个版本中有99%的时间更好,但是我可以想象用例中std::array<>可能有用(通过索引访问成员)。

在评论中建议使用std::vector<> 这是正确的,并且标准保证成员位于相邻位置,但它们可能不在对象本地(在std::array<>它们对于对象本地)。

是的,可以保证顺序与[class.mem] .19中的声明相同

分配具有相同访问控制的(非联盟)类的非静态数据成员,以便以后的成员在类对象中具有更高的地址 未指定具有不同访问控制的非静态数据成员的分配顺序。 实施一致性要求可能会导致两个相邻成员不能彼此立即分配; 管理虚拟功能和虚拟基类的空间要求也可能如此。

[元答案]

我的生活更好吗?

为什么连续分配数据成员必然会提高性能? 实际上,因为类似double类的东西需要适当对齐,所以通常情况恰恰相反(这就是编译器并不总是这样做的原因)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM