小编rel*_*t95的帖子

为什么循环缓冲区在 C++ 中没有标准化?

我想知道循环缓冲区(循环队列或双端队列)标准化的历史。

AFAIK,当前的 C++ 标准(C++ 2023)在 STL 中没有提供循环缓冲区。我用 google 搜索了一下,只发现了一个提案,ring_span大约是在 2015 年。Boost 的circular_buffer. 有些提供内部实现,例如cqueue.

如果使用 a 重复推入和弹出操作std::deque,则会重复分配和释放堆块。在 Qt(最大的 C++ 项目之一)中,情况更糟,QQueue不断分配堆块(并且从不释放)。

我不是在征求意见。我想了解历史。我认为标准化循环缓冲区如此困难有充分的理由。

c++ circular-buffer

8
推荐指数
0
解决办法
2555
查看次数

C++ 20中acquire操作的定义在哪里?

我正在阅读cppreference.com 上的std::memory_order和C++ 20 规范。我找不到术语“获取操作”和“释放操作”的定义。

第一个文档递归地定义了这些术语,表示“具有 memory_order_acquire 或更强的原子加载是一个获取操作”。和“memory_order_acquire:使用此内存顺序的加载操作在受影响的内存位置上执行获取操作。”

第二份文件似乎使用了这些术语,但没有任何定义。它开始使用这些术语,表示“一个或多个内存位置上的同步操作要么是消耗操作、获取操作、释放操作,要么是获取和释放操作。”

所以我用谷歌搜索并找到了LINUX KERNEL MEMORY BARRIERS,它清楚地定义了如下术语。

(5) 获取操作。

这起到了单向渗透屏障的作用。它保证 ACQUIRE 操作之后的所有内存操作看起来都发生在相对于系统的其他组件的 ACQUIRE 操作之后。ACQUIRE 操作包括 LOCK 操作以及 smp_load_acquire() 和 smp_cond_load_acquire() 操作。

在 ACQUIRE 操作之前发生的内存操作可能看起来是在 ACQUIRE 操作完成之后发生的。

ACQUIRE 操作几乎总是与 RELEASE 操作配对。

这个定义与作者对术语“获取操作”的含义完全相同吗?

c++ atomic memory-barriers language-lawyer stdatomic

4
推荐指数
1
解决办法
197
查看次数