在环形缓冲区中向后循环的好方法是什么

Whats a good way to loop backwards in a ring buffer?

本文关键字:循环 方法 是什么 缓冲区      更新时间:2023-10-16

假设我有一个缓冲区:

static const int BUFFER_SIZE = 3; // for example
int buffer[BUFFER_SIZE];

我想循环通过它

int index = 0;
for( ;; )
{
    buffer[index] = ...;
    index = (index + 1) % BUFFER_SIZE; // index = 0, 1, 2, 0, 1, 2, 0, 1, 2, ...
}   

但是,如果我想向后循环访问缓冲区,会发生什么情况?例如:

0, 2, 1, 0, 2, 1, ...

现在我正在这样做:

index  = (index <= 0) ? BUFFER_SIZE - 1 : index  - 1;

有没有更好的方法来执行这些操作?

本着您第一个决定的精神,我们可以这样写:

int idx = 0; 
int i=0;
for (;;) {
      buffer[idx] = ...;
      i =  (i+1) % BUFFER_SIZE;
      idx = (BUFFER_SIZE - i) % BUFFER_SIZE;
}

你可以试试这个:

for (int *p = buffer;;) {
  if (p == buffer) p = buffer + BUFFER_SIZE;        
  // these next lines could be combined using the pre-decrement operator
  // at expense of some readability
  p--;
  int index = int(p - buffer); // in case you need the zero-based index
  *p = ...;   
}

或者这个:

for (int *p = buffer + BUFFER_SIZE - 1;;p--) {
  int index = int(p - buffer); // in case you need the zero-based index
  *p = ...;
  if (p == buffer) p = buffer + BUFFER_SIZE;        
}