细节:与大神交流记录

14 篇文章 0 订阅
12 篇文章 0 订阅
本文介绍了C99中的柔性数组特性,通过动态和静态分配内存展示了其使用方法,并提出了减少malloc、memcpy及锁的使用原则。在处理大数据量时,建议采用多线程结合工作队列的策略,以提高效率。同时,强调了预分配空间和指针操作在优化程序执行效率上的重要性。
摘要由CSDN通过智能技术生成

0.前言

俗话说“听君一席话,胜读十年书”,在项目执行过程中有幸同一位大神进行了一次交流。收获良多,特记录于此,以供后参。

1.使用柔性数组

在C99标准中,添加了一个新特性——柔性数组:

typedef struct
{
    int len;
    char buf[0];
}SOFT_ARR,*SOFT_ARR_PTR;

上述结构体类型SOFT_ARR中的成员buf即为柔性数组。其中,sizeof(SOFT_ARR)的结果为4,表明结构体成员buf并未占用内存空间。

可以按照如下两种方式使用柔性数组:

  • 方式1:动态分配内存
#define MAX_DATA_LEN 10
SOFT_ARR_PTR sa=(SOFT_ARR_PTR)malloc(sizeof(SOFT_ARR)+MAX_DATA_LEN);
  • 方式2:静态分配内存 10
#define MAX_DATA_LEN
char buf[sizeof(SOFT_ARR)+MAX_DATA_LEN]={0};
SOFT_ARR_PTR sa=(SOFT_ARR_PTR)buf;

在这两种使用方式下,sa.data的长度均为10,区别在于内存空间的分配方式。这就引出如下三个原则。

2.三个原则

(1) 少使用malloc函数:频繁使用malloc会导致内存碎片的产生,且不易于管理。

(2)少使用memcpy函数:memcpy函数会增加程序执行时间,应多使用指针赋值操作,且应采用指针累加偏移,而不是数组累乘以提升效率。(乘法指令执行时间大于加法指令)。

(3)少锁:在多线程环境下,减少锁的使用,或尽可能降低锁的粒度。

3.大数据量的多线程处理

类似于使用UDP传输的音视频数据,在进行处理时应首先使用一个线程专门负责接收数据,并将其存入缓冲区中(工作队列(链表))。然后另外使用一个或多个线程负责从缓冲区中取出数据并进行处理。这里除了多线程处理之外,还涉及到如下两个要点。

4.工作队列与空闲队列

处理过程中所使用的缓冲区应该分为工作队列与空闲队列(在操作系统内核中有大量使用这种方式)。初始化时仅为空闲队列分配好空间,在实际处理的过程中,实时地从空闲队列(链表)中取下一个节点加入到工作队列中。之后,工作队列处理完一个节点后,将该节点归还到空闲队列中。这样做的好处是预分配空间后可在程序运行过程中减少malloc与free的次数,而且所有操作均可使用指针操作完成,可以提升程序的执行效率。

5.总结

对于大数据量的快速处理需求,可以采用如下模式:

UDP+柔性数组+多线程+工作队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weekman93

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值