sách gpt4 ăn đã đi

c++ - 优化:在多个对象使用之前预分配一 block 堆内存 - yield ?

In lại 作者:太空狗 更新时间:2023-10-29 20:00:44 25 4
mua khóa gpt4 giày nike

通过提前分配堆内存并逐渐填充它是否可以大大提高性能?

考虑下面这个非常简单的例子:

byte * heapSpace = malloc (1 000 000);
int currentWriteSpot = 0;

struct A {
số nguyên x;
byte * extraSpace;
int extraSpaceLength;
};

//a1 needs 10 bytes of extra storage space:
A a1;
a1.x = 2;
a1.extraSpace = heapSpace + currentWriteSpot;
a1.extraSpaceLength = 10;

currentWriteSpot += 10;

//a2 needs 120 bytes of extra storage space:
A a2;
a2.x = 24;
a2.extraSpace = heapSpace + currentWriteSpot;
a2.extraSpaceLength = 120;

currentWriteSpot += 120;

// ... many more elements added

for ( ... ) {
//loop contiguously over the allocated elements, manipulating contents stored at "extraSpace"
}

free (heapSpace);

sự tương phản:

...
a1.extraSpace = malloc ( 10 );
a2.extraSpace = malloc ( 120 );
a3...
a4...
...

//làm gì đó

free (a1.extraSpace);
free (a2.extraSpace);
free ...
free ...
free ...

或者这可能只是增加了复杂性而没有显着提高性能?

Cảm ơn tất cả mọi người!

câu trả lời hay nhất

首先,这样做并不会增加复杂性;它减少了它。因为您已经在操作开始时确定 trung tâm 成功,所以您不需要任何进一步的失败检查,这至少必须 miễn phí 分配已经对各种对象的状态进行了更改,并且可能会撤消其他更改。

正如您所指出的,其他好处之一是性能。在调用 trung tâm 可能导致锁争用的多线程程序中,这将是一个更大的问题。

也许更重要的好处是避免碎片化。如果整个数据对象是一起分配的而不是小块分配的,释放它肯定会将整个大小的可用连续空间返回到空闲内存池以供以后分配使用。另一方面,如果您分别分配每个小块,它们很可能不会连续。

除了减少碎片之外,将所有数据分配为单个连续 block 还可以避免每次分配的开销(每次分配至少浪费 8-16 个字节)并改善缓存目的的数据局部性。

顺便说一句,如果您发现这种分配策略过于复杂,您可以尝试制作一些函数来为您处理它,或者使用现有的库,如 GNU obstack。

关于c++ - 优化:在多个对象使用之前预分配一 block 堆内存 - yield ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5225914/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress