相关疑难解决方法(0)

restrict关键字在C++中的含义是什么?

我总是不确定,在C++中,restrict关键字是什么意思?

是否意味着赋予函数的两个或更多指针不重叠?还有什么意思?

c++ restrict-qualifier

179
推荐指数
5
解决办法
10万
查看次数

memcpy()vs memmove()

我想了解的区别memcpy()memmove(),和我读的文本memcpy(),而没有照顾重叠源和目的地memmove()一样.

但是,当我在重叠的内存块上执行这两个函数时,它们都会给出相同的结果.例如,在memmove()帮助页面上采用以下MSDN示例: -

有没有更好的例子来理解它的缺点memcpymemmove解决方法?

// crt_memcpy.c
// Illustrate overlapping copy: memmove always handles it correctly; memcpy may handle
// it correctly.

#include <memory.h>
#include <string.h>
#include <stdio.h>

char str1[7] = "aabbcc";

int main( void )
{
    printf( "The string: %s\n", str1 );
    memcpy( str1 + 2, str1, 4 );
    printf( "New string: %s\n", str1 );

    strcpy_s( str1, sizeof(str1), "aabbcc" );   // reset string

    printf( "The string: …
Run Code Online (Sandbox Code Playgroud)

c memcpy memmove

151
推荐指数
6
解决办法
14万
查看次数

为什么memmove比memcpy更快?

我正在研究应用程序中的性能热点,它将50%的时间花在memmove(3)上.应用程序将数百万个4字节整数插入到已排序的数组中,并使用memmove将数据"向右"移位,以便为插入的值腾出空间.

我的期望是复制内存非常快,我很惊讶在memmove上花了这么多时间.但后来我认为memmove很慢,因为它正在移动重叠区域,这必须在紧密的循环中实现,而不是复制大页面的内存.我写了一个小的微基准测试,以确定memcpy和memmove之间是否存在性能差异,期望memcpy能够取胜.

我在两台机器(核心i5,核心i7)上运行我的基准测试,看到memmove实际上比memcpy更快,在旧核心i7上甚至快了两倍!现在我正在寻找解释.

这是我的基准.它用memcpy复制100 mb,然后用memmove移动大约100 mb; 来源和目的地重叠.尝试了源和目的地的各种"距离".每次测试运行10次,打印平均时间.

https://gist.github.com/cruppstahl/78a57cdf937bca3d062c

以下是Core i5的结果(Linux 3.5.0-54-generic#81~precision1-Ubuntu SMP x86_64 GNU/Linux,gcc是4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5).括号中的数字是源和目的地之间的距离(间隙大小):

memcpy        0.0140074
memmove (002) 0.0106168
memmove (004) 0.01065
memmove (008) 0.0107917
memmove (016) 0.0107319
memmove (032) 0.0106724
memmove (064) 0.0106821
memmove (128) 0.0110633
Run Code Online (Sandbox Code Playgroud)

Memmove实现为SSE优化的汇编代码,从后到前复制.它使用硬件预取将数据加载到缓存中,并将128个字节复制到XMM寄存器,然后将它们存储在目标中.

(memcpy-ssse3-back.S,第1650行)

L(gobble_ll_loop):
    prefetchnta -0x1c0(%rsi)
    prefetchnta -0x280(%rsi)
    prefetchnta -0x1c0(%rdi)
    prefetchnta -0x280(%rdi)
    sub $0x80, %rdx
    movdqu  -0x10(%rsi), %xmm1
    movdqu  -0x20(%rsi), %xmm2
    movdqu  -0x30(%rsi), %xmm3
    movdqu  -0x40(%rsi), %xmm4
    movdqu  -0x50(%rsi), %xmm5
    movdqu  -0x60(%rsi), %xmm6
    movdqu  -0x70(%rsi), %xmm7
    movdqu  -0x80(%rsi), %xmm8
    movdqa  %xmm1, …
Run Code Online (Sandbox Code Playgroud)

c c++ memory performance

88
推荐指数
3
解决办法
2万
查看次数

当memcpy()比memmove()更快时,真正的重要案例是什么?

memcpy()和源之间的关键区别memmove()是,memmove()当源和目标重叠时,它将正常工作.当缓冲区肯定不重叠时,memcpy()更可取,因为它可能更快.

困扰我的是这个潜在的.它是一种微观优化还是存在真正重要的例子,当memcpy()我们真的需要使用memcpy()而不是坚持memmove()到处时?

c c++ memory memcpy memmove

16
推荐指数
2
解决办法
4144
查看次数

简单的C数组声明/赋值问题

在更高级别的语言中,我将能够在C中使用类似于此示例的内容,并且它会很好.但是,当我编译这个C例子时,它会痛苦地抱怨.如何将新数组分配给我声明的数组?

int values[3];

if(1)
   values = {1,2,3};

printf("%i", values[0]);
Run Code Online (Sandbox Code Playgroud)

谢谢.

c arrays declaration variable-assignment

7
推荐指数
3
解决办法
4万
查看次数

memmove 的性能与 memcpy 相比两次?

我已经看到memmove 和 memcpy 的区别是什么?它说memmove might be very slightly slower than memcpy

我们可以memmove通过执行以下操作来实现替代方法:分配一个临时缓冲区,然后memcpy两次(src -> tmp,tmp -> dest)。我的问题是:哪种方式更快,memmove或者另一种选择?

c c++ memcpy memmove

0
推荐指数
1
解决办法
1804
查看次数