2011-03-15 31 views
5

Bu sorun mu var?memcpy kendi kendine kopyalama kopyalama

char buf[] = { 0, 1, 2 }; 
memcpy(buf, buf + 1, 2); 

Daha büyük bir veri türüne sahip olmak fark yaratıyor mu? Memmove kullanabileceğimi biliyorum(), ama sadece merak ediyorum.

+0

-1: Ne zaman denediniz? – pmg

+3

+1, çünkü pmg'nin -1 ile aynı fikirde değilim. “Standartta baktığınız zaman ne oldu?”, Belki, ama bu tür bir şeyi denemede gerçek bir risk var, bunu deneyebilirsiniz ve sonuçta “işte”, sonuç {1,2,2}. tamponda. O zaman bunu denemek için tavsiye nedir? Gelecek hafta, ya da optimizasyonu veya müşterilerinizin bilgisayarlarını açtığınızda işe yarayacak mı? –

+0

@Steve Jessop: Katılıyorum. OP'nin örneği (muhtemelen), 'memcpy' in özel hedef platform uygulamasına bağlı olarak işe yarayacaktır, ancak bu iyi bir fikir değildir! – GrahamS

cevap

12

memcpy'un etkileri, giriş ve çıkış üst üste geldiğinde tanımlanmaz. memmove kullanmalısınız.

5

Tamam değil. Kaynak ve hedef üst üste geldiğinde, numaralı telefonu memmove kullanmalısınız.

O olabilir memcpy ile İşinden, derleyici'nın uygulamaya bağlı, ama bu itimat gereken bir şey değil! senin memcpy(buf, buf + 1, 2) ile

typedef unsigned char uint8; 

void * memcpy (void * destination, const void * source, size_t num) 
{ 
    const uint8* pSrc = (const uint8*)source; 
    const uint8* const pSrcEnd = pSrc + num; 
    uint8* pDst = (uint8*)destination; 

    while (pSrc != pSrcEnd) 
     *(pDst++) = *(pSrc++); 

    return destination; 
} 

tamam çalışacak, ama daha az iyi olan memcpy(buf + 1, buf, 2)

3

:


Tipik naif uygulama aşağıdaki gibi bir bayt-bayt kopyasını (uint8) olabilir Bellek bölgeleri örtüşüyorsa davranış tanımlanmamıştır, bu nedenle bu tamam değildir.

1

Bu tanımsız davranıştır, ama öyle gibi kullanmış, hedef son noktası kaynağının başlangıç ​​noktası daha azdır

char buf[] = {0, 1, 2, 3); 
memcpy(buf, buf+2, 2); 

. Hala emin olmak için memmove kullanmalısınız ...

+0

GNU C Kütüphanesi, memcpy uygulamasını birkaç kez değiştirdi. Bazen i686 vs i386 vs x86_64 için bile farklıdır. –