首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在我的C++代码中使用指向对象的共享指针的向量来防止对象复制

在我的C++代码中使用指向对象的共享指针的向量来防止对象复制
EN

Software Engineering用户
提问于 2017-11-10 18:24:58
回答 2查看 18.2K关注 0票数 12

在我的C++项目中,我有三个类,ParticleContactNetworkNetwork类将具有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分量矢量),并且在模拟过程中,位置和接触力都将被允许变化(例如蒙特卡罗模拟)。

EN

回答 2

Software Engineering用户

发布于 2017-11-10 18:44:56

因此,这实际上取决于您预期的访问模式。首先,shared_ptr在多线程程序中可能要付出很大的代价。增加和减少引用计数将导致其他CPU上的处理器缓存失效。这将导致这些操作稍微昂贵一些,如果从多个线程以任何方式访问这些对象,则会导致大量缓存混乱,因为即使是对引用计数附近的字节的读取访问,也会导致在引用计数更新后获取非常昂贵的主内存。

现在,您可以减轻这种情况的一种方法是不像别人告诉您的那样使用make_shared。这将导致独立于对象分配引用计数。但这可能会将缓存问题转移到其他地方。

各种类型的指针都是关于表示所有权的。对象真的有共享的所有权吗?还是把整个网络看作拥有对象更合适呢?如果是后者,可能更有意义的是存储裸指针,只需在网络中有几个vector对象(每种类型一个),将unique_ptrs保存到所有的图形元素中。

每个粒子的接触数是否在相当小的数目上有界?如果是这样的话,那么使用一个固定大小的array来存储指向联系人的裸露指针列表,并拥有一个真正拥有所有对象的Network可能是有意义的。

我相信还有更多的考虑。我主要关注的是性能,而不是“正确”的做事方式的一些抽象概念。也许你的主要目标不是性能,而是其他的东西。但是,如果是这样的话,为什么在这里使用C++呢?

票数 3
EN

Software Engineering用户

发布于 2017-11-11 04:23:21

我不得不问--为什么Contacts和Particles是分开的?似乎每个Particle都应该包含它的联系人列表。或者,如果这不合适,也许另一个classstruct包含Contacts的Particle和数组(或vector或其他任何东西)。

代码语言:javascript
复制
struct ParticleCollision {
    Particle part;
    std::vector<Contact> contacts;
};

Network将包含一个std::vector of ParticleCollisions。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/360598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档