![](http://webcf.waybackmachine.org/web/20210514022809im_/https://habrastorage.org/getpro/habr/avatars/d27/ccd/743/d27ccd743d8bccbf1a885e5dadaa7ffe.jpg)
Используем черную магию для создания быстрого кольцевого буфера
- Перевод
![](https://webcf.waybackmachine.org/web/20210514022809im_/https://habrastorage.org/getpro/habr/upload_files/77b/16c/aa5/77b16caa57c040300db89d0ea12a2d32.png)
Вчера я заглянул на страницу Википедии, посвященную кольцевому буферу (circular buffer), и был заинтригован предполагаемой техникой оптимизации, с которой до этого не был знаком:
Реализация кольцевого буфера может быть оптимизирована путем отображения нижележащего буфера в двух смежных областях виртуальной памяти. (Естественно, длина нижележащего буфера должна в таком случае равняться некоторому размеру кратному страницы страницы системы.) Чтение и запись в кольцевой буфер могут выполняться в этой реализации с большей эффективностью посредством прямого доступа к памяти; те обращения, которые выходят за пределы первой области виртуальной памяти, автоматически переходят в начало нижележащего буфера. Когда смещение чтения продвигается во вторую область виртуальной памяти, оба смещения - чтения и записи - уменьшаются на длину нижележащего буфера.
В рамках реализации кольцевого буфера нам необходимо обработать случай, когда сообщение попадает на «разрыв» в очереди и должно быть перенесено (wrap around). Очевидная реализация записи в кольцевой буфер может полагаться на побайтовую запись и выглядеть примерно так: