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.
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.
memcpy
'un etkileri, giriş ve çıkış üst üste geldiğinde tanımlanmaz. memmove
kullanmalısınız.
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)
:
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.
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 ...
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. –
-1: Ne zaman denediniz? – pmg
+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ı? –
@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