C++ 在C+中创建大量对象+;
在移动设备上有没有处理大量对象实例化(每秒40k)的模式?我需要这些单独的对象,它们不能组合。重用对象可能是一个解决方案。有什么提示吗?有。将旧对象保留在池中,并尽可能重复使用它们。C++ 在C+中创建大量对象+;,c++,iphone,performance,C++,Iphone,Performance,在移动设备上有没有处理大量对象实例化(每秒40k)的模式?我需要这些单独的对象,它们不能组合。重用对象可能是一个解决方案。有什么提示吗?有。将旧对象保留在池中,并尽可能重复使用它们。 由于内存分配和删除的成本,您将节省大量时间。如果对象的大小都相同,请尝试一个简单的单元分配器,其中包含一个侵入性的空闲节点链接列表: free: add node to head of list allocate: if list is non-empty: remove the
由于内存分配和删除的成本,您将节省大量时间。如果对象的大小都相同,请尝试一个简单的单元分配器,其中包含一个侵入性的空闲节点链接列表:
free:
add node to head of list
allocate:
if list is non-empty:
remove the head of the list and return it
else:
allocate a large block of memory
split it into cells of the required size
add all but one of them to the free list
return the other one
如果分配和释放都在一个线程中完成,那么就不需要任何同步。如果它们是在不同的线程中完成的,那么每秒40k上下文切换可能比每秒40k分配更令人担忧;-)
您可以将单元设置为“原始内存”(并为类使用placement new或overload操作符new),或者始终保持对象初始化,即使它们位于“空闲列表”上,并将所需的任何值分配给“新”对象的成员。这取决于初始化的费用有多高,可能是单元分配器和对象池之间的技术区别。如果没有更多信息,很难说清楚如何改进代码,但您可能想查看库。它们都为不同的特定用例提供了不同的快速分配内存的方法。选择最适合您的用例的对象。如果对象大小相同,您可以分配大量内存并使用
placement new
,这将有助于降低分配成本,因为所有对象都位于连续内存中:
Object *pool = malloc( sizeof(Object) * numberOfObjects );
for(int i=0; i<numberOfObjects; i++)
new (&pool[i]) Object()
Object*pool=malloc(sizeof(Object)*numberOfObjects);
对于(int i=0;i),我认为您可以考虑这些设计模式:
- 对象池
- 工厂
我希望这也能对你有所帮助:我使用了类似的模式来编程随机反应扩散系统(在台式计算机上每秒创建数百万个对象)和实时图像处理(同样,每秒几十万或数百万个)
基本思路如下:
- 创建一个分配器,用于分配所需对象的大型数组;要求该对象具有一个“下一个”指针(我通常创建一个用下一个指针包装对象的模板)
- 每当您需要一个对象时,从这个分配器获取一个对象(使用从您调用的内存块初始化的新语法)
- 每次完成后,将其返回给分配器并将其放在堆栈上
- 如果堆栈是非空的,分配器会从堆栈中提供一些内容,否则会从其数组缓冲区中提供一些内容。如果缓冲区用完,则可以分配另一个较大的缓冲区并复制现有使用的节点,或者让分配器维护一个完全使用的分配块堆栈
- 当您处理完所有对象后,删除分配器。附带好处:您不必确保释放每个对象;它们都会消失。附带成本:您最好确保在堆上而不是在这个临时缓冲区(或使用一个永久缓冲区)分配任何要永久保留的内容
使用此方法时,我的性能通常比原始malloc/new高10倍左右。如果对象是冗余的,则可以使用flyweight模式。此模式在类似对象之间共享内存。经典示例是用于字处理程序中字符图形表示的数据结构m
维基百科有一个独特的功能
< C++ > C++ C++,iPhone是C++的C++代码,它的代码在C++中运行得非常完美。