在我的C++项目中,我有三个类,Particle、Contact和Network。Network类将具有N粒子(std::vector<Particle> particles)和Nc联系人(std::vector<Contact> contacts)。Particle对象每个都有许多联系人,由Contact对象表示,联系人由粒子对共享。
我有必要知道一个特定的粒子有什么联系,我已经决定通过Network对象(例如,使用network.getContacts(Particle particle))获得这些信息。
我的问题可以分为两部分:
首先,什么是有效的和社区推荐的方式来存储每个粒子的触点?
我相信,我既可以创建指向Contact对象的共享指针向量,也可以创建vector<vector<shared_ptr<Contact>>> prtContacts (为了便于查看,我不再使用std:: ),因此prtContacts[i]将包含指向ith粒子的联系人的共享指针向量。有人建议在这种情况下使用shared_ptr是有用的,因为它将确保我不会为两个具有共享接触的粒子创建重复的Contact对象。有没有其他更有意义的方法?
第二,如果我最终创建了上面定义的prtContacts,那么初始化它的最佳方法是什么?我目前的想法是有一个初始循环,它用Nc联系人初始化std::vector<Contact> contacts,然后有第二个循环,用指向联系人的共享指针初始化prtContacts。这是否合理,还是同样有其他更有效的办法?
谢谢!
粒子的数量,N,将从O(10^1)到O(10^4)。每个粒子的接触数很可能不超过6-7,但允许变化。每个接触都有一个与其相关联的位置和接触力(2分量矢量),并且在模拟过程中,位置和接触力都将被允许变化(例如蒙特卡罗模拟)。
发布于 2017-11-10 18:44:56
因此,这实际上取决于您预期的访问模式。首先,shared_ptr在多线程程序中可能要付出很大的代价。增加和减少引用计数将导致其他CPU上的处理器缓存失效。这将导致这些操作稍微昂贵一些,如果从多个线程以任何方式访问这些对象,则会导致大量缓存混乱,因为即使是对引用计数附近的字节的读取访问,也会导致在引用计数更新后获取非常昂贵的主内存。
现在,您可以减轻这种情况的一种方法是不像别人告诉您的那样使用make_shared。这将导致独立于对象分配引用计数。但这可能会将缓存问题转移到其他地方。
各种类型的指针都是关于表示所有权的。对象真的有共享的所有权吗?还是把整个网络看作拥有对象更合适呢?如果是后者,可能更有意义的是存储裸指针,只需在网络中有几个vector对象(每种类型一个),将unique_ptrs保存到所有的图形元素中。
每个粒子的接触数是否在相当小的数目上有界?如果是这样的话,那么使用一个固定大小的array来存储指向联系人的裸露指针列表,并拥有一个真正拥有所有对象的Network可能是有意义的。
我相信还有更多的考虑。我主要关注的是性能,而不是“正确”的做事方式的一些抽象概念。也许你的主要目标不是性能,而是其他的东西。但是,如果是这样的话,为什么在这里使用C++呢?
发布于 2017-11-11 04:23:21
我不得不问--为什么Contacts和Particles是分开的?似乎每个Particle都应该包含它的联系人列表。或者,如果这不合适,也许另一个class或struct包含Contacts的Particle和数组(或vector或其他任何东西)。
struct ParticleCollision {
Particle part;
std::vector<Contact> contacts;
};Network将包含一个std::vector of ParticleCollisions。
https://softwareengineering.stackexchange.com/questions/360598
复制相似问题