零拷贝和二级指针
日期:2026.3.21
文章标签: #队列 #[[指针]] #C语言
1. 学习内容
知识点总览
| 序号 | 知识点 |
|---|---|
| 1 | 深入理解传值和传引用([[指针]])的区别 |
| 2 | 初步接触零拷贝 |
| 3 | 初步接触二级指针 |
知识点关联思维导图

2. 逐点精讲
知识点 1:队列实现零拷贝
实际意义
零拷贝的作用是通过减少数据拷贝次数和系统调用来减少内存开销,实现 CPU 的零参与,依赖 DMA 和内存映射技术来实现
辅助图示
- 值传递和指针传递的区别

通俗人话解释
值传递就是把快递发给你,指针传递就是把快递放的地址发给你
核心逻辑/原理
队列值传递和指针传递都会经过两次拷贝,但是因为指针不超过 4 个字节,当值传递的数据字节较大时,利用二级指针向队列传递指向结构体或变量的地址的指针来实现伪零拷贝(零拷贝的意思是 CPU 不参与拷贝),减少内存开销(当传递数据大于 4 个字节情况下)
关键公式/结论
- 使用局部变量的指针来实现零拷贝,队列传递指针需要 static 延长变量的生命周期,不然函数结束后指针会悬空,队列传递的数据变成垃圾值

3. 相关资料
🎥 视频链接
🔗 资料链接
4. Q&A
Q 1:对于传递大于 4 字节的变量,为什么指针传递比值传递效率高?
A 1: 指针传递只需要分配 8 个字节空间,而值传递大于 8 个字节空间
Q 2:什么是零拷贝?
A 2: 零拷贝是指 CPU 零参与数据从一个地址到另一个地址的复制过程
Q 3:freertos 的消息队列时如何工作的?哪一行代码实现了数据拷贝?
A 3:
- 向队列传数据实则是通过拷贝传入的变量的指针下的数据到队列自身分配的缓冲区中,其字节是创建队列时设定的数据类型的字节数,同时从队列中接收数据就是将队列缓冲区中的数据拷贝到指定的指针下
- ( void ) memcpy( ( void * ) pxQueue->u.xQueue.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); 这段代码大致意思为将
pvItemToQueue指向的数据(大小为uxItemSize字节)复制到队列的读取位置(pcReadFrom指向的位置)
Q 4:如果按键按的太快,前一次写入的值会不会被覆盖掉?如何要保证不被覆盖掉需要做什么?
A 4: 按键按的太快,在不丢中断的情况在,前一次写入队列数据还没被接收,会继续写入队列并不会被覆盖,如果写入的是全局变量会被覆盖
Q 5:const void * const pvItemToQueue,两个 const 的作用分别是什么?
A 5: 第一个 const 表示这是一个指向常量的指针(该地址下的值不能通过指针来改变),第二个 const 表示这是一个值为地址的常量(地址不能改变)

浙公网安备 33010602011771号