3

N3485 20.6.9.1 [allocator.members]/1 说:

对分配或解除分配特定存储单元的这些函数的调用应以单个总顺序发生,并且每个此类解除分配调用应在此顺序的下一次分配(如果有)之前发生。

最后一个要求让我感到困惑。看起来标准是说,如果一个人分配了一块内存(我们称之为 block a),然后分配另一个块(我们称之为 block ),那么在释放 block之前b不允许释放 block 。ab

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

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

4

1 回答 1

2

对分配或解除分配特定存储单元的这些函数的调用应以单个总顺序发生,并且每个此类解除分配调用应在此顺序的下一次分配(如果有)之前发生。

在我看来,它只在分配和释放之间建立了先发生的关系(以防止可能由不正确的编译器优化引起的并发问题)。它绝对不会在不同的分配区域之间a建立关系。bab

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

比较

reads -> deallocation -> allocation -> writes

reads -> deallocation
allocation -> writes

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

于 2012-12-09T08:11:46.837 回答