标签: memcpy

memcpy()和strncpy()有什么区别,因为后者很容易替代前者?

memcpy()和之间有什么重大区别strncpy()?我问这个是因为我们可以轻松地改变strncpy()以复制我们想要的任何类型的数据,而不仅仅是字符,只需将前两个非char*参数转换char*为第三个参数,并将第三个参数更改为非char类型的大小的倍数.在下面的程序中,我已经成功地使用它来将整数数组的一部分复制到其他程序中,并且它的效果一样好memcpy().

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


    int main ()
    {
    int arr[2]={20,30},brr[2]={33,44};
    //memcpy(arr,brr,sizeof(int)*1);
    strncpy((char*)arr,(char*)brr,sizeof(int)*1);
    printf("%d,%d",arr[0],arr[1]);

    }
Run Code Online (Sandbox Code Playgroud)

同样,我们可以使其适用于float其他数据类型.那么有什么重大区别memcpy()呢?

PS:另外,我想知道为什么memcpy()string.h头文件中,几乎所有的库函数都与字符串有关,而memcpy()在本质上更通用.任何原因?

c memcpy strncpy string.h

12
推荐指数
2
解决办法
9016
查看次数

使用reinterpret_cast的签名别名

采取以下代码

#include <iostream>

void func() {
    int i = 2147483640;
    while (i < i + 1)
    {
        std::cerr << i << '\n';
        ++i;
    }

    return;
}

int main() {
    func(); 
}
Run Code Online (Sandbox Code Playgroud)

这段代码显然是错误的,因为while循环仅在有符号的int i溢出(即UB)时才能终止,因此编译器可以例如将其优化为无限循环(Clang在上进行-O3)或执行其他类型的时髦操作。现在我的问题是:从我对C ++标准的阅读中,等同于签名的类型可能会别名(即指针int*unsigned*别名)。为了进行一些时髦的签名“包装”,以下内容是否具有未定义的行为?

#include <iostream>

static int safe_inc(int a)
{
    ++reinterpret_cast<unsigned&>(a);
    return a;
}

void func() {
    int i = 2147483640;
    while (i < safe_inc(i))
    {
        std::cerr << i << '\n';
        ++i;
    }

    return;
}

int main() {
    func(); …
Run Code Online (Sandbox Code Playgroud)

c++ signed memcpy language-lawyer reinterpret-cast

12
推荐指数
2
解决办法
262
查看次数

如何使用movntdqa来避免缓存污染?

我正在尝试编写一个memcpy函数,它不会将源内存加载到cpu缓存中.目的是避免缓存污染.下面的memcpy函数可以工作,但是像标准的memcpy那样污染了缓存.我正在使用P8700 proccesoor与visual C++ 2008 express.我看到了intel vtune的cpu缓存使用情况.

void memcpy(char *dst,char*src,unsigned size){
    char *dst_end=dst+size;
    while(dst!=dst_end){
        __m128i res = _mm_stream_load_si128((__m128i *)src);
        *((__m128i *)dst)=res;
        src+=16;
        dst+=16;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有另一个版本,具有相同的结果 - 工作,但污染缓存.

void memcpy(char *dst,char*src,unsigned size){

        char *dst_end = dst+size;

        __asm{
        mov edi, dst 
        mov edx, dst_end 
        mov esi,src
        inner_start: 
        LFENCE 
      MOVNTDQA xmm0,    [esi ]
      MOVNTDQA xmm1, [esi+16] 
      MOVNTDQA xmm2, [esi+32] 
      MOVNTDQA xmm3, [esi+48] 
      //19. ; Copy data to buffer 
      MOVDQA [edi], xmm0 
      MOVDQA  [edi+16], xmm1 
      MOVDQA  [edi+32], xmm2 
      MOVDQA  [edi+48], xmm3 
    //  25. ; …
Run Code Online (Sandbox Code Playgroud)

c++ assembly memcpy

11
推荐指数
1
解决办法
3931
查看次数

memcpy和指针

我很困惑如何使用memcpy读取数组中复制的指针.以下是我尝试过的,但不起作用.

基本上,我已经分配了内存块,我在其中复制类似于数组时尚的指针,但在重试期间它无法正常工作.虽然这适用于基本数据类型

我想在element块中存储任何东西,它可以是integers或者pointers.

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

#define INDEX(x)  ((char *)elements + (sizeof(int*) * (x)))
int size = 10;

void f2_int_ptr() {    
    int i = 0;
    void *elements = (void*)malloc(size * sizeof(int*));
    for ( i = 0; i < size; i++ ) { 
       int *v = ( int *) malloc ( sizeof(int));
       memcpy ( v, &i, sizeof ( int ));


       memcpy ( INDEX(i) , v,  sizeof (int*));
    }
    for ( i = …
Run Code Online (Sandbox Code Playgroud)

c memcpy

11
推荐指数
1
解决办法
3万
查看次数

让GCC编译而不插入对memcpy的调用

我目前正在使用GCC 4.5.3,为PowerPC 440编译,并且正在编译一些不需要libc的代码.我没有直接调用memcpy(),但编译器似乎在构建期间插入一个.

有一些链接器选项,如-nostdlib,-nostartfiles,-nodefaultlibs但我无法使用它们,因为我没有进行链接阶段.我只是在编译.有这样的事情:

$ powerpc-440-eabi-gcc -O2 -g -c -o output.o input.c
Run Code Online (Sandbox Code Playgroud)

如果我用nm检查output.o,我会看到对memcpy的引用:

$ powerpc-440-eabi-nm output.o | grep memcpy
     U memcpy
$ 
Run Code Online (Sandbox Code Playgroud)

GCC手册页明确了如何使用链接器删除对memcpy和其他libc调用的调用,但我不希望编译器首先插入它们,因为我使用的是完全不同的链接器(不是GNU的ld) ,它不知道libc).

感谢您的任何帮助,您可以提供.

compiler-construction gcc libc memcpy

11
推荐指数
3
解决办法
8122
查看次数

使用memcpy避免陷阱表示

请考虑以下代码:

float float_value = x; // x is any valid float value
int int_value = 0;
size_t size = sizeof(int) < sizeof(float) ? sizeof(int) : sizeof(float);
memcpy(&int_value, &float_value, size);
Run Code Online (Sandbox Code Playgroud)

据我所知,这可能导致陷阱表示.我的问题:

  1. 真的吗?
  2. 如果没有,为什么?
  3. 如果没有,是否有另一种方法可以避免可能的陷阱表示?

c memcpy

11
推荐指数
1
解决办法
631
查看次数

如何在C中记忆二维数组的一部分?

如何在C中记忆二维数组:

我有一个二维数组:

int a[100][100];

int c[10][10];
Run Code Online (Sandbox Code Playgroud)

我想使用memcpy将数组c中的所有值复制到数组a,如何使用memcpy执行此操作?

int i;
for(i = 0; i<10; i++)
{
    memcpy(&a[i][10], c, sizeof(c));
}
Run Code Online (Sandbox Code Playgroud)

它是否正确?

c arrays memcpy

11
推荐指数
1
解决办法
2万
查看次数

了解memcpy()的实现

我正在寻找memcpy.c的实现,我发现了一个不同的memcpy代码.我无法理解他们为什么这样做(((地址)s)|((ADDRESS)d)| c)&(sizeof(UINT) - 1)

#if !defined(__MACHDEP_MEMFUNC)

#ifdef _MSC_VER
#pragma function(memcpy)
#undef __MEMFUNC_ARE_INLINED
#endif

#if !defined(__MEMFUNC_ARE_INLINED)
/* Copy C bytes from S to D.
 * Only works if non-overlapping, or if D < S.
 */
EXTERN_C void * __cdecl memcpy(void *d, const void *s, size_t c)
{
    if ((((ADDRESS) s) | ((ADDRESS) d) | c) & (sizeof(UINT) - 1)) {

        BYTE *pS = (BYTE *) s;
        BYTE *pD = (BYTE *) d;
        BYTE *pE = (BYTE *) (((ADDRESS) s) + c); …
Run Code Online (Sandbox Code Playgroud)

c language-implementation memcpy

11
推荐指数
2
解决办法
1310
查看次数

使用memcpy()函数将unsigned char数组中的字节放入std :: string

我有std :: string变量.我需要从无符号字符数组中加入一些字节.我知道第一个字节和第一个字节.

我可以使用std :: string :: assign函数.我做到了

但我想使用memcpy函数以正确的方式解决该问题.

std::string newString;
memcpy(&newString, &bytes[startIndex], length);
Run Code Online (Sandbox Code Playgroud)

我知道这是错的.我已经使用std :: vector研究并发现了一些想法.

请帮我找到这个问题最优雅的解决方案.

c++ stl memcpy unsigned-char

11
推荐指数
1
解决办法
1万
查看次数

针对Core 2或Core i7架构进行全面优化的memcpy/memmove?

具有DDR3双通道内存的Core 2处理器的理论最大内存带宽令人印象深刻:根据维基百科关于架构的文章,每秒10+或20+千兆字节.但是,库存memcpy()调用不会达到此目的.(3 GB/s是我在这样的系统上看到的最高.)可能,这是由于OS供应商要求memcpy()根据处理器的特性针对每个处理器线进行调整,因此库存memcpy()实现在众多品牌和产品线上应该是合理的.

我的问题:是否可以在C程序中使用Core 2或Core i7处理器的免费高度调整版本?我敢肯定,我不是唯一一个需要一个人的人,每个人微量优化他们自己的memcpy()将是一个很大的浪费.

c optimization memcpy

10
推荐指数
2
解决办法
6200
查看次数