c - 高效的循环队列重新排序

标签 c queue arrays

我正在使用循环队列作为数据缓冲区。我正在使用 char 数组来保存数据,我的问题是当我需要按原始顺序查看缓冲区中的数据时。缓冲区的重新排序占用了大部分处理时间,占 64%。我需要尽可能优化它,因为我使用这个缓冲区来搜索千兆字节数据中的签名。非常感谢任何优化建议和/或关于如何存储此缓冲区并将其轻松转换为 char 数组以进行处理的任何其他建议。提前致谢

编辑:抱歉,我所说的重新排序的意思是,如果数据是“abcdef”,那么缓冲区很有可能看起来像“defabc”,所以我需要将缓冲区重新排序为“abcdef”

队列结构:

typedef struct item{
unsigned char* data;
int length;
} item;

typedef struct queue{
unsigned char *data;
int front;
int back;
int length;
int size;
} queue;

重新排序功能:

int toStr(queue *ptr, item *ret){
int length;
int i;
int j;
int back = ptr->back;
int size = ptr->size;
char* tmp;
char* tmp_data;

if(ptr->length == 0){
    return 0;
}

tmp = ret->data;
ret->length = ptr->length;
tmp_data = ptr->data;
i = ptr->front;
j = 0;
while(i != back){
    //ret->data[j] = tmp_data[i];
    tmp[j] = tmp_data[i];
    ++i;
    ++j;
    if(i > size){
        i = 0;
    }
}

return 1;
}

最佳答案

现在您正在复制所有数据只是为了按顺序查看。我想我会提供一个函数来将下标转换为指向缓冲区中正确位置的指针:

unsigned char *sub(queue const *q, int subscript) { 
    return q->data + (front + subscript) % q->size);
}

然后按顺序使用数据是这样的:

for (i=0; i<q->size; i++)
    printf("%c\n", *sub(q, i));

关于c - 高效的循环队列重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6482424/

相关文章:

c - 缺少用于 Tcl C 扩展的内置命令 "history"

c++ - 制作 cv::Mat 队列

python - 既然 Celery 4 已经放弃了 Windows 支持,那么 Windows 上的(Python 3)任务队列的最佳选择是什么?

php获取数组的数据大小

arrays - 使用 LINQ 如何连接来自 SortedDictionary<string,List<byte[]>> 的字节

c - Fgets 在每次调用时重写字符串数组位置 [0] 上的最后一行

c代码中的困惑

c++ - Win32 有路径编辑控件吗?

queue - 在非 ISR 上下文中使用 "FromISR"FreeRTOS 调用有什么缺点(如果有)?

创建共享内存