Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存管理接口 我在C++中编写了一个小粒子系统,但我还不知道如何管理与粒子相关的数据——如果它被存储在静态或动态数组中,在链表中,两者兼有,或者其他任何人可能想到的?_C++_Memory Management - Fatal编程技术网

内存管理接口 我在C++中编写了一个小粒子系统,但我还不知道如何管理与粒子相关的数据——如果它被存储在静态或动态数组中,在链表中,两者兼有,或者其他任何人可能想到的?

内存管理接口 我在C++中编写了一个小粒子系统,但我还不知道如何管理与粒子相关的数据——如果它被存储在静态或动态数组中,在链表中,两者兼有,或者其他任何人可能想到的?,c++,memory-management,C++,Memory Management,目前,我不想做出选择,而是希望使用一个抽象类进行内存管理,它一方面为我提供分配和释放例程,另一方面负责在析构函数中释放提供的资源。我希望通过这种方式,我可以快速、透明地在不同的粒子管理策略之间进行切换和测试 1) 这样做合理吗 2) 如果是:是否有提供此类功能的库 谢谢你的帮助 经验法则是使用std::vector,除非您确实有理由选择其他内容。现在你可以坚持下去。要在低级别控制内存管理,您可以使用自己的分配器提供向量,以防应更换std::allocator,该分配器将使用std::new_al

目前,我不想做出选择,而是希望使用一个抽象类进行内存管理,它一方面为我提供分配和释放例程,另一方面负责在析构函数中释放提供的资源。我希望通过这种方式,我可以快速、透明地在不同的粒子管理策略之间进行切换和测试

1) 这样做合理吗

2) 如果是:是否有提供此类功能的库


谢谢你的帮助

经验法则是使用
std::vector
,除非您确实有理由选择其他内容。现在你可以坚持下去。要在低级别控制内存管理,您可以使用自己的
分配器提供
向量
,以防应更换
std::allocator
,该分配器将使用
std::new_allocator
。如果您主要关心的是广泛删除和分配单个对象,那么您可能会考虑编写自己的用户定义的分配器,该分配器将从固定大小的元素池中分配到链接列表中,因为传统的和更一般的<代码> OEPRPROTER NEW()
在多次调用一次分配或取消分配一个对象的情况下效率低下

在我看来,测试不同的容器是一件合理的事情,但是向量应该足够了。为了决定

1) 这样做合理吗

因此,这些测试应该包括在内——你必须考虑你将要广泛使用的操作

2) 如果是:是否有提供此类功能的库


我不知道这样的库。

< p>对于一个粒子系统,你可能希望考虑每个粒子的每个坐标、速度、颜色通道等使用一个<代码> STD::矢量< /代码>。乙二醇

std::vector<float> x(100);
std::vector<float> vx(100);
etc
std::向量x(100);
std::向量vx(100);
等
而不是

std::vector<Particle> p(100)
标准:向量p(100)
这被称为SOA(数组结构),而不是AOS(结构数组)。前者更易于矢量化。

当然不做链接列表。好的,但为什么不呢?我认为动态增长和收缩的内存可以通过链表很好地管理,而粒子一直在死亡和诞生。此外,我不需要通过索引进行访问。容器的经验法则是使用
std::vector
,除非您有理由不这样做。如果将项目以某种方式存储在向量中,则通常可以使用二进制搜索找到所需的元素。对于较小的缓存,缓存友好性通常大于插入/删除的O(n)objects@user412173好吧,从理论上讲,那会很好。但另一件需要考虑的是它是否“缓存友好”。关于这一点我不太了解,但我认为有理由假设,按顺序存储项目在缓存上比将其存储在所有地方更友好。vector比listpiotrus更友好缓存:谢谢,知道std::vector通常是一个不错的选择当然很好,而且我也不知道可选的分配器参数!然而,我仍然困惑:它不会使系统慢下来吗?每当我不得不删除一个粒子时,向量实现就必须移动所有在内存中跟随的粒子?如果你打算从开始或结束中广泛删除,那么列表就要考虑了。然而,想想我提到的分配器,我不明白std::vector中的用户定义分配器如何帮助加快删除;据我所知,在初始化或调整大小时,它只会告诉std::vector在哪里请求空间,但是删除时必须移动大量空间的问题仍然存在?@user412173提供您自己的分配器,您可以更改此行为。似乎我不明白-您能提供一些参考吗?安德鲁:非常感谢您指出这些不同的选择,我会考虑的!