1

假设我们有一个外部库,它可以在一个双精度浮点数数组上非常快速地进行计算(大多数时候是多线程的)。为方便起见,我以面向对象的方式编写代码,以便获得一组对象。每个对象都有一个持有双精度值的属性。使用强大的外部库的天真的方法是这样的:

double temp[N];
for i from 1 to N
   temp[i] = objectArray[i].property;
end

但是,这需要时间和额外的内存来保存临时数组。有没有更好的方法来做到这一点?

这是一个普遍的问题,但我基本上想在 C++ 中解决这个问题。

4

2 回答 2

2

如果您确定您的对象只包含一个double数据成员,没有添加数据成员的基础,也没有virtual函数 - 请检查静态断言sizeof(*objectArray) == sizeof(double)- 并假设您的外部库函数是离线的,您可以只传递外部图书馆 adouble*objectArray[0].

如果库函数在您包含的标头中内联,您可能会遇到别名问题,并且应该咨询您的编译器文档以获取选项。

如果您的objectArray元素不仅仅包含double每个元素,那么如果这是外部库所期望的,则必须它们复制到压缩数组中。(您可能会考虑的一个选择是将double值保存在数组中,并让更复杂的对象存储对数组元素的引用)。

于 2016-04-26T07:24:58.960 回答
1

您可以为您的对象使用竞技场策略。基本上我们的对象将只包含一个索引和一个数据区的句柄。实际数据存储在正确索引的竞技场中。这样,当您需要创建 double 的向量时,它已经存在于竞技场中。

这仅在您始终知道哪些对象被一起处理并且它们几乎总是一起处理的情况下才有效。如果您每次都需要选择需要的对象,这不会给您带来任何性能提升(除非对象在数组中始终是连续的)。这也使常规对象访问速度稍慢一些,因此只有在每次复制值确实是您程序中的瓶颈时才有意义。

您的数据结构如下所示:

class Arena {
   vector<double> propertyX;
   vector<double> propertyY;
   int next_index;
};

class MyObject {
  int index;
  Arena& arena
  MyObject(Arena& arena_ref): arena(arena_ref) { index = arena.next_index++; }
  double getX() { return arena.propertyX[index]; }
};

你需要更多的代码来确保分配的东西等等,但你明白了。现在,当您需要调用外部库时,您可以直接从Arena对象中获取数组。

于 2016-04-26T08:15:09.043 回答