SORU
6 Mayıs 2009, ÇARŞAMBA


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
6 Mayıs 2009, ÇARŞAMBA


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--;
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DeAdPiXel6667

    DeAdPiXel666

    2 Ocak 2010
  • Vintendo Power

    Vintendo Pow

    2 Ocak 2007
  • Vsauce

    Vsauce

    30 Temmuz 2007