Tag: memcpy

错误:警告:内置函数'memcpy'的不兼容隐式声明

我得到这个错误。 error: warning: incompatible implicit declaration of built-in function 'memcpy' [enabled by default] 这是代码: int arr[ 12] = {1,0,0,0,0,0,0,0,0,0,9370, 0}; void *a = &arr; memcpy(machine->mem, a,12*4); 我做错了什么?

为什么memcpy()的速度每4KB急剧下降?

我testing了memcpy()的速度,注意到速度在i * 4KB下急剧下降。 结果如下:Y轴是速度(MB /秒),X轴是memcpy()的缓冲区大小,从1KB增加到2MB。 图2和图3详细描述了1KB-150KB和1KB-32KB的部分。 环境: CPU:Intel(R)Xeon(R)CPU E5620 @ 2.40GHz OS:2.6.35-22-generic#33-Ubuntu GCC编译器标志:-O3 -msse4 -DINTEL_SSE4 -Wall -std = c99 我想它必须与高速caching相关,但是我无法从以下高速caching不友好的情况中find原因: 为什么我的程序在循环8192个元素时变慢? 为什么转置512×512的matrix要比转置513×513的matrix慢得多? 由于这两种情况的性能下降是由不友好的循环引起的,这些循环将零散的字节读入高速caching,浪费了高速caching行的剩余空间。 这是我的代码: void memcpy_speed(unsigned long buf_size, unsigned long iters){ struct timeval start, end; unsigned char * pbuff_1; unsigned char * pbuff_2; pbuff_1 = malloc(buf_size); pbuff_2 = malloc(buf_size); gettimeofday(&start, NULL); for(int i = 0; […]

如何提高memcpy的性能

概要: memcpy似乎无法在真实或testing应用程序中在我的系统上传输超过2GB /秒。 我能做些什么来获得更快的内存到内存拷贝? 全部细节: 作为数据采集应用程序的一部分(使用一些专用硬件),我需要将大约3 GB /秒的临时缓冲区拷贝到主内存中。 为了获取数据,我给硬件驱动程序提供了一系列缓冲区(每个2MB)。 硬件DMA将数据发送到每个缓冲区,然后在每个缓冲区满时通知我的程序。 我的程序清空缓冲区(memcpy到另一个较大的RAM块),并将处理后的缓冲区重新发送到卡再次填充。 我有memcpy移动数据足够快的问题。 看起来内存到内存的拷贝速度应该足够快,可以在我运行的硬件上支持3GB /秒的速度。 Lavalys EVEREST给我提供了9337MB / sec的内存复制基准testing结果,但是即使在一个简单的testing程序中,我也无法使用memcpy获得接近这些速度的任何地方。 我通过添加/删除缓冲区处理代码中的memcpy调用来隔离性能问题。 没有memcpy,我可以运行完整的数据速率 – 约3GB /秒。 在启用memcpy的情况下,我仅限于550Mb / sec(使用当前的编译器)。 为了在我的系统上对memcpy进行基准testing,我已经编写了一个单独的testing程序,在一些数据块上调用memcpy。 (我已经发布了下面的代码)我已经在我使用的编译器/ IDE(National Instruments CVI)以及Visual Studio 2010中运行了这个。虽然我目前没有使用Visual Studio,但我愿意如果能够产生必要的性能,就可以进行切换。 但是,在盲目转移之前,我想确保它能解决我的memcpy性能问题。 Visual C ++ 2010:1900 MB /秒 NI CVI 2009:550 MB /秒 虽然我并不感到奇怪CVI比Visual Studio慢很多,但是我对memcpy的性能这么低感到惊讶。 虽然我不确定这是否可以直接比较,但这比EVEREST基准带宽要低得多。 虽然我不需要相当的性能水平,但至less需要3GB /秒。 标准库的实现肯定不会比EVEREST所使用的更糟糕! 在这种情况下,我能做些什么来加快memcpy的速度? 硬件细节:AMD Magny […]

strcpy与memcpy

memcpy()和strcpy()有什么区别? 我试图find一个程序的帮助,但都给出了相同的输出。 int main() { char s[5]={'s','a','\0','c','h'}; char p[5]; char t[5]; strcpy(p,s); memcpy(t,s,5); printf("sachin p is [%s], t is [%s]",p,t); return 0; } 产量 sachin p is [sa], t is [sa]

是否保证执行memcpy(0,0,0)是安全的?

我对C标准不太了解,请耐心等待。 我想知道是否可以保证memcpy(0,0,0)是安全的。 唯一的限制,我可以find的是,如果内存区域重叠,那么行为是未定义的… 但是我们可以认为这里的内存区域是重叠的吗?

Linux上可怜的memcpy性能

我们最近购买了一些新的服务器,并且遇到可怜的memcpy性能。 与我们的笔记本电脑相比,memcpy的性能比服务器慢3倍。 服务器规格 底盘和Mobo:超级微型1027GR-TRF CPU:2x Intel Xeon E5-2680 @ 2.70 Ghz 内存:8x 16GB DDR3 1600MHz 编辑:我也在另一台服务器上testing稍高的规格,并看到与上述服务器相同的结果 服务器2规格 底盘和Mobo:超级微型10227GR-TRFT CPU:2x Intel Xeon E5-2650 v2 @ 2.6 Ghz 内存:8x 16GB DDR3 1866MHz 笔记本电脑规格 机箱:联想W530 CPU:1x Intel Core i7 i7-3720QM @ 2.6Ghz 内存:4x 4GB DDR3 1600MHz 操作系统 $ cat /etc/redhat-release Scientific Linux release 6.5 (Carbon) $ uname -a […]

我可以调用“字节数”设置为零的memcpy()和memmove()吗?

当我实际上没有任何东西移动/复制memmove() / memcpy()作为边缘情况下,我需要处理案件吗? int numberOfBytes = … if( numberOfBytes != 0 ) { memmove( dest, source, numberOfBytes ); } 或者我应该只是调用函数而不检查 int numberOfBytes = … memmove( dest, source, numberOfBytes ); 前面的代码段中的检查是否必要?

memmove和memcpy有什么区别?

memmove和memcpy什么区别? 你通常使用哪一个?

死亡的JPEG如何运行?

我一直在阅读关于针对Windows XP和Windows Server 2003上的GDI +的老版本攻击,这些攻击称为我正在进行的项目的死亡JPEG。 这个漏洞在下面的链接中得到很好的解释: http : //www.infosecwriters.com/text_resources/pdf/JPEG.pdf 基本上,一个JPEG文件包含一个称为COM的部分,其中包含一个(可能是空的)注释字段和一个包含COM大小的两个字节的值。 如果没有注释,则大小为2.读取器(GDI +)读取大小,减去两个大小,然后分配适当大小的缓冲区以复制堆中的注释。 攻击涉及在该字段中设置值0 。 GDI +减2 ,导致值为-2 (0xFFFe) ,由memcpy转换为无符号整数0XFFFFFFFE 。 示例代码: unsigned int size; size = len – 2; char *comment = (char *)malloc(size + 1); memcpy(comment, src, size); 注意到第三行的malloc(0)应该返回一个指向堆中未分配内存的指针。 如何写0XFFFFFFFE字节( 4GB !!!!)可能不会崩溃程序? 这是否超出堆区,并进入其他程序和操作系统的空间? 那会发生什么? 正如我所了解的memcpy ,它只是从目的地复制n字符到源。 在这种情况下,源应该在栈上,堆上的目的地, n是4GB 。

为什么对于不是TriviallyCopyable的对象,std :: memcpy的行为是未定义的?

从http://en.cppreference.com/w/cpp/string/byte/memcpy : 如果对象不是TriviallyCopyable (例如标量,数组,C兼容结构),则行为是未定义的。 在我的工作中,我们已经使用std::memcpy很长时间来按位交换不是TriviallyCopyable的对象: void swapMemory(Entity* ePtr1, Entity* ePtr2) { static const int size = sizeof(Entity); char swapBuffer[size]; memcpy(swapBuffer, ePtr1, size); memcpy(ePtr1, ePtr2, size); memcpy(ePtr2, swapBuffer, size); } 从来没有任何问题。 我明白,滥用std::memcpy与非TriviallyCopyable对象并导致下游未定义的行为是微不足道的。 不过,我的问题是: 为什么在使用非TriviallyCopyable对象时, std::memcpy本身的行为是未定义的? 为什么标准认为有必要指定? UPDATE http://en.cppreference.com/w/cpp/string/byte/memcpy的内容已经被修改,以回应这个post和post的答案。 目前的描述说: 如果对象不是TriviallyCopyable (例如标量,数组,C兼容结构),则行为是不确定的,除非程序不依赖于目标对象(不由memcpy运行)的析构函数的效果以及目标对象(已结束,但未由memcpy启动)通过其他方式启动,如placement-new。 PS 评论者@Cubbi: @RSahu如果有东西保证UB下游,它呈现整个程序未定义。 但我同意,在这种情况下,似乎有可能绕过UB,并相应地修改相关的参考。