怎样写出一个更快的 memset/memcpy
2个回答
展开全部
实现能在不同拷贝长度,对齐和不对齐,平均比 memcpy 快40%(gcc4.9, vc 2012),主要是以下几个优化点:
策略区别:64字节以内用小内存方案,64K以内用中尺寸方案,大于64K用大内存拷贝方案。
查表跳转:拷贝不同小尺寸内存,直接跳转到相应地址解除循环。
目标对齐:64字节以上拷贝的先用跳转表方法拷贝几个字节让目标地址对齐,好做后面的事情。
矢量拷贝:并行一次性读入N个矢量到 sse2 寄存器,再并行写出。
缓存预取:使用 prefetchnta ,提前预取数据,等到真的要用时数据已经到位。
内存直写:使用 movntdq 来直写内存,避免缓存污染。
策略区别:64字节以内用小内存方案,64K以内用中尺寸方案,大于64K用大内存拷贝方案。
查表跳转:拷贝不同小尺寸内存,直接跳转到相应地址解除循环。
目标对齐:64字节以上拷贝的先用跳转表方法拷贝几个字节让目标地址对齐,好做后面的事情。
矢量拷贝:并行一次性读入N个矢量到 sse2 寄存器,再并行写出。
缓存预取:使用 prefetchnta ,提前预取数据,等到真的要用时数据已经到位。
内存直写:使用 movntdq 来直写内存,避免缓存污染。
展开全部
使用memcpy函数所需头文件:
C语言:#include<string.h>
C++:#include<cstring.h>
函数原型:
void *memcpy(void *dest, const void *src, size_t n);
示例:
#include <stdio.h>
#include <string.h>
int main()
{
char* s="GoldenGlobalView";
chard[20];
clrscr();
memcpy(d,s,(strlen(s)+1));
printf("%s",d);
getchar();
return 0;
}
C语言:#include<string.h>
C++:#include<cstring.h>
函数原型:
void *memcpy(void *dest, const void *src, size_t n);
示例:
#include <stdio.h>
#include <string.h>
int main()
{
char* s="GoldenGlobalView";
chard[20];
clrscr();
memcpy(d,s,(strlen(s)+1));
printf("%s",d);
getchar();
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询