sách gpt4 ăn đã đi

c++ - 是否允许以不同于调用 allocator::allocate() 的顺序调用 allocator::deallocate()?

In lại 作者:太空狗 更新时间:2023-10-29 21:47:05 26 4
mua khóa gpt4 giày nike

N3485 20.6.9.1 [allocator.members]/1 说:

Calls to these functions that allocate or deallocate a particular unit of storage shall occur in a single total order, and each such deallocation call shall happen before the next allocation (if any) in this order.

这最后一个要求让我感到困惑。看起来标准是说如果分配一个内存块(我们称它为 block Một),然后分配另一个 block (我们称它为 block b),然后不允许释放 block Một,直到它释放 block b

如果这确实是本段所包含的内容,我看不出如何以节省空间的方式实现像vector 这样的增长;因为无法分配更大的缓冲区,然后释放之前分配的(太小的)缓冲区。

这实际上是这一段的意思,还是我误读了这一部分?

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

Calls to these functions that allocate or deallocate a particular unit of storage shall occur in a single total order, and each such deallocation call shall happen before the next allocation (if any) in this order.

在我看来,它只是在分配和解除分配之间建立了一种先行发生的关系(以防止可能因不正确的编译器优化而引起的并发问题)。它肯定不会在 Mộtb 之间建立关系,其中 Mộtb 是不同的分配区域。

请记住,编译器遵循的是规范,而不是人类逻辑。该规范帮助编译器程序员记住所有需要注意的细节(如果它遵循规范,那就是正确的)。这就是为什么规范包含人们认为显而易见的细节的原因。其中一个细节是释放/分配构成内存屏障。

比较

reads -> deallocation -> allocation -> writes

reads -> deallocation
allocation -> writes

如果没有 happens-before 关系,两个线程可能会同时使用相同的内存区域(存储单元),正如内存区域所观察到的那样。对于 happens-before 关系,来自释放线程的所有访问都必须在分配线程开始使用它之前被刷新。

关于c++ - 是否允许以不同于调用 allocator::allocate() 的顺序调用 allocator::deallocate()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13785690/

26 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