Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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+中创建大量对象+;_C++_Iphone_Performance - Fatal编程技术网

C++ 在C+中创建大量对象+;

C++ 在C+中创建大量对象+;,c++,iphone,performance,C++,Iphone,Performance,在移动设备上有没有处理大量对象实例化(每秒40k)的模式?我需要这些单独的对象,它们不能组合。重用对象可能是一个解决方案。有什么提示吗?有。将旧对象保留在池中,并尽可能重复使用它们。 由于内存分配和删除的成本,您将节省大量时间。如果对象的大小都相同,请尝试一个简单的单元分配器,其中包含一个侵入性的空闲节点链接列表: free: add node to head of list allocate: if list is non-empty: remove the

在移动设备上有没有处理大量对象实例化(每秒40k)的模式?我需要这些单独的对象,它们不能组合。重用对象可能是一个解决方案。有什么提示吗?

有。将旧对象保留在池中,并尽可能重复使用它们。
由于内存分配和删除的成本,您将节省大量时间。

如果对象的大小都相同,请尝试一个简单的单元分配器,其中包含一个侵入性的空闲节点链接列表:

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++中运行得非常完美。