Circular Buffer Uygulaması: Sabit Bellek ile Hızlı Veri Depolama

Circular buffer, sabit boyutlu bir dizide verileri döngüsel olarak depolayan bir veri yapısıdır. Bellek kullanımı önceden belli olduğu için gömülü sistemlerde ve yüksek performans gerektiren uygulamalarda sıkça kullanılır. Yeni veri geldiğinde en eski veriyi otomatik olarak üzerine yazar.

Bu teknik özellikle ses işleme, ağ paketleme ve sensör verilerinde işe yarar. Dinamik bellek ayırma olmadığı için bellek parçalanması sorunu yaşanmaz.

1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5typedef struct {
6int *buffer;
7int capacity;
8int head; // yazma konumu
9int tail; // okuma konumu
10int count; // dolu eleman sayısı
11} CircularBuffer;
12
13CircularBuffer* create_buffer(int size) {
14CircularBuffer *cb = malloc(sizeof(CircularBuffer));
15cb->buffer = malloc(size * sizeof(int));
16cb->capacity = size;
17cb->head = 0;
18cb->tail = 0;
19cb->count = 0;
20return cb;
21}
22
23void enqueue(CircularBuffer *cb, int value) {
24cb->buffer[cb->head] = value;
25cb->head = (cb->head + 1) % cb->capacity;
26
27if (cb->count < cb->capacity) {
28cb->count++;
29} else {
30cb->tail = (cb->tail + 1) % cb->capacity;
31}
32}
33
34int dequeue(CircularBuffer *cb) {
35if (cb->count == 0) {
36printf("Buffer boş!\n");
37return -1;
38}
39
40int value = cb->buffer[cb->tail];
41cb->tail = (cb->tail + 1) % cb->capacity;
42cb->count--;
43return value;
44}
45
46void print_buffer(CircularBuffer *cb) {
47printf("Buffer içeriği: ");
48for (int i = 0; i < cb->count; i++) {
49int idx = (cb->tail + i) % cb->capacity;
50printf("%d ", cb->buffer[idx]);
51}
52printf("\n");
53}
54
55int main() {
56CircularBuffer *cb = create_buffer(5);
57
58enqueue(cb, 10);
59enqueue(cb, 20);
60enqueue(cb, 30);
61enqueue(cb, 40);
62enqueue(cb, 50);
63print_buffer(cb); // 10 20 30 40 50
64
65enqueue(cb, 60); // 10 üzerine yazılır
66print_buffer(cb); // 20 30 40 50 60
67
68printf("Çıkış: %d\n", dequeue(cb)); // 20
69print_buffer(cb); // 30 40 50 60
70
71free(cb->buffer);
72free(cb);
73return 0;
74}

Beklenen çıktı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1Buffer içeriği: 10 20 30 40 50
2Buffer içeriği: 20 30 40 50 60
3Çıkış: 20
4Buffer içeriği: 30 40 50 60

Kodda `head` yazma, `tail` okuma konumunu gösterir. Modulo operatörü (%) ile dizinin sonuna ulaşınca başa döneriz. Buffer doluyken yeni veri gelirse en eski veri otomatik silinir.

Sık yapılan hata: Kapasite kontrolü yapmadan `enqueue` çağrısı yapıp buffer overflow'a neden olmak. Yukarıdaki kod bunu otomatik yönetir, ama gerçek uygulamada hata kontrolleri ekleyin.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz