我需要一个固定大小的循环缓冲区(创建时可在运行时 Select ,而不是编译时),它可以容纳任何类型的对象,并且需要very个高性能.我不认为会有资源争用问题,因为尽管它是在一个多任务嵌入式环境中,但它是一个合作的环境,因此任务本身可以管理它.

我最初的 idea 是在缓冲区中存储一个简单的 struct ,它将包含类型(简单枚举/定义)和一个指向有效负载的空指针,但我希望它尽可能快,因此我愿意接受涉及绕过堆的建议.

事实上,我很乐意绕过任何标准库来提高原始速度——从我看到的代码来看,它并没有针对CPU进行大量优化:看起来他们只是编译了strcpy()之类的C代码,没有手工编码的汇编.

任何代码或 idea 都将不胜感激.所需操作包括:

  • 创建具有特定大小的缓冲区.
  • 放在 tail 上.
  • 从头上拿开.
  • 把计数还给我.
  • 删除缓冲区.

推荐答案

您是否可以枚举编写缓冲区时所需的类型,或者是否需要能够在运行时通过动态调用添加类型?如果是前者,那么我会将缓冲区创建为n个 struct 的堆分配数组,其中每个 struct 由两个元素组成:标识数据类型的枚举标记和所有数据类型的联合.在小元素额外存储方面的损失,可以通过不必处理分配/解除分配和由此产生的内存碎片来弥补.然后,您只需要跟踪定义缓冲区的头和尾元素的开始和结束索引,并确保在递增/递减索引时计算modn.

C++相关问答推荐

我可以动态分配具有空类型函数的矩阵吗?

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

VS代码C/C++扩展intellisense无法检测环境特定函数'

如何将字符串argv[]赋给C中的整型数组?

为什么I2C会发送错误的数据?

我可以在C中声明不同长度数组的数组而不带变量名吗?

非正规化边缘毛刺

进程已完成,退出代码为138 Clion

是否可以通过调用两个函数来初始化2D数组?示例:ARRAY[STARTING_ROWS()][STARTING_COLUMNS()]

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

如何在C++中安全地进行浮点运算

获取前2个连续1比特的索引的有效方法

C语言中的外部关键字

用C++构建和使用DLL的困惑

正在try 理解C++中的`正在释放的指针未被分配‘错误

Linux/C:带有子进程的进程在添加waitid后都挂起

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

模仿 memmove 的行为

将指针的地址加载到寄存器内联拇指组件中

C11 嵌套泛型