通过指针的方式,代替memcopy,增加数据拷贝速度

在Linux 多线程通信.全局变量,结构体,队列,项目模版(一)一篇文章中
有段代码中有一个,*PtFrame = *Frame,方法是通过指针方式,拷贝数据,速度很快,通过指针指向一个结构体,便可以,实现快速赋值,复制数据,如果是视频数据流,一帧数据是非常的大1000多个字节至少,如果要对数据进行搬移,将会非常耗时,视频会卡顿。解决办法是,将这个队列,定义成结构体类型,每次只传入指针,进行拷贝,第二种是本篇想要验证的,只传指针给队列,快速读写队列,网络接收到数据到buf,buf指针指向malloc申请的地址。这个地址不释放,放在指针数组里,按位移量,给队列。

1、通过指针指向一个结构体

struct data1,data2
struct pdata1,pdata2
pdata1 = data1;
pdata2 = data2;

*pdata2 = *pdata1 

*pdata2 = *pdata1 ,是否比memcpy快,可以自己验证一下,写个大的循环,看谁先完成数据拷贝

2、队列指针指向malloc地址,不复制数据
在这里插入图片描述

原理简单分析一下

定义一个结构体
typedf struct data
{
	int data[1000];
}data, *pdata;

定义多个全局变量指针,
pdata  ptrdata1 = (pdata  )malloc(dizeof(struct data)); 
pdata  ptrdata2 = (pdata  )malloc(dizeof(struct data)); 
pdata  ptrdata3 = (pdata  )malloc(dizeof(struct data)); 
pdata  ptrdata4 = (pdata  )malloc(dizeof(struct data)); 

定义一个全局变量指针数组
int * offsetdata[20]
offsetdata[0] = (int *)ptrdata1;
offsetdata[1] = (int *)ptrdata2;
offsetdata[2] = (int *)ptrdata3;
....

定义一个结构体数据类型的,队列,写队列每次只传指针,关于队列,看上一篇,这里只做演示
SX_S32 QUEUE_Frame__Write(QUEUE_Frame *head,   int * Frame)
{
	struct data *PtFrame = head + s32IndexW;	//获取队列的首地址,写偏移量,进行偏移,下一个要的位移地址
    int * offset = Frame[s32IndexW];
	PtFrame = (struct data)offset ;//强制类型转换回来
	s32IndexW = (s32IndexW+1) % size;//队列写偏移指针,位移加1
	return 1;
}

调用

int main()
{
    QUEUE_Frame *head = (QUEUE_Frame *)malloc(sizeof(QUEUE_Frame ));//定义消息队列首地址
	QUEUE_Frame__Write(head, offsetdata)
}

实际编程试试

#include<stdio.h>
#include<stdlib.h>

typedef struct data
{
	int num[2];	
}DataType,*P_DataType;


int main()
{
	P_DataType Head = (P_DataType)malloc(2);

	P_DataType data1 = (P_DataType)malloc(2);
	P_DataType data2 = (P_DataType)malloc(2);
	P_DataType data3 = (P_DataType)malloc(2);


	data1->num[0] = 1;
	data1->num[1] = 2;

	data2->num[0] = 3;
	data2->num[1] = 4;

	data3->num[0] = 5;
	data3->num[1] = 6;

	int *prt1 = (int *)data1;
	int *prt2 = (int *)data2;
	int *prt3 = (int *)data3;
	
    int *a[3] = {prt1,prt2,prt3};
//只复制指针
	prt1 = a[0];
	Head = (P_DataType)prt1;
	printf("finish %d, %d\r\n",Head->num[0],Head->num[1]);
//通过指针复制数据
	prt1 = a[1];
	P_DataType p = (Head +1);
	*p = *((P_DataType)prt1);	
	printf("finish %d, %d\r\n",p->num[0],p->num[1]);
//memcpy方式,拷贝
	prt1 = a[2];
	P_DataType p2 = (Head +2);
	memcpy(p2,prt1,8);	
	printf("finish %d, %d\r\n",p2->num[0],p2->num[1]);

	return 0;
}

在这里插入图片描述
访问数据时正确的。
第一种和第二种哪种快,没验证过,理论上第一种快,没有发生数据拷贝,只是指针指向,第三种估计要慢一点
在音视频编程中,这是非常有用的,实际项目也是这样用过的,保证了我的网络数据包,能够快速写完,编码解码时,非常流畅。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值