Nasıl C dairesel bir tampon uygulamak mı?
Herhangi bir türdeki nesneleri tutabilir ve olması gereken sabit boyutlu (çalıştırma bunu oluştururken, derleme zamanı değil seçilebilir) dairesel bir tampon ihtiyacı varçokyüksek performans. Çoklu görev gömülü bir ortamda olmasına rağmen, kooperatif bir o yönetmek kendilerini, görevleri bir yana kaynak çakışması sorunları olacaktır sanmıyorum.
Benim ilk düşünce olduğunu saklamak için basit bir yapı arabellek hangisi içeren türü (basit numaralama/define ve void işaretçi yükü ama istiyorum bunun için olabildiğince hızlı bu yüzden ben açmak için öneriler ve seks atlayarak öbek.
Aslında ben mutlu atlamak için herhangi bir standart kütüphane için ham hız - gördüklerim kodu, değil ağır optimize edilmiş CPU : göründüğü gibi sadece derlenmiş C kodu gibi şeyler strcpy()
ve böyle, yok el-kodlu derleme.
Herhangi bir kod veya fikir büyük mutluluk duyacağız. İşlemleri gereklidir:
- boyutta bir tampon oluşturmak.
- kuyruk koymak.
- başından almak.
- Kont dönüş.
- bir tampon silin.
CEVAP
En basit çözümü madde boyutu ve öğe sayısını, takip ve bayt sayısını bir tampon oluşturmak için olabilir:
typedef struct circular_buffer
{
void *buffer; // data buffer
void *buffer_end; // end of data buffer
size_t capacity; // maximum number of items in the buffer
size_t count; // number of items in the buffer
size_t sz; // size of each item in the buffer
void *head; // pointer to head
void *tail; // pointer to tail
} circular_buffer;
void cb_init(circular_buffer *cb, size_t capacity, size_t sz)
{
cb->buffer = malloc(capacity * sz);
if(cb->buffer == NULL)
// handle error
cb->buffer_end = (char *)cb->buffer capacity * sz;
cb->capacity = capacity;
cb->count = 0;
cb->sz = sz;
cb->head = cb->buffer;
cb->tail = cb->buffer;
}
void cb_free(circular_buffer *cb)
{
free(cb->buffer);
// clear out other fields too, just to be safe
}
void cb_push_back(circular_buffer *cb, const void *item)
{
if(cb->count == cb->capacity)
// handle error
memcpy(cb->head, item, cb->sz);
cb->head = (char*)cb->head cb->sz;
if(cb->head == cb->buffer_end)
cb->head = cb->buffer;
cb->count ;
}
void cb_pop_front(circular_buffer *cb, void *item)
{
if(cb->count == 0)
// handle error
memcpy(item, cb->tail, cb->sz);
cb->tail = (char*)cb->tail cb->sz;
if(cb->tail == cb->buffer_end)
cb->tail = cb->buffer;
cb->count--;
}
Nasıl uygulamak için !önemli kullanıyo...
Nasıl Pull-to-Yenileme Android uygulam...
Nasıl tek bir tampon (çok) yakın Vim y...
Nasıl Yığını ve JavaScript bir Sıra uy...
nasıl iOS pop-up iletişim kutusu uygul...