memcpy ve memmove fonksiyonlarını kendiniz implemente edin. Aralarındaki fark nedir?
Cevap
İkisi de n byte'ı kaynaktan hedefe kopyalar. Fark şudur: `memcpy` bölgeler çakışıyorsa (overlap) tanımsız davranış gösterir, `memmove` ise çakışmayı doğru yönetir. memmove, hedef kaynaktan sonra başlıyorsa kopyalamayı sondan başa doğru yapar.
#include <stddef.h>
#include <stdint.h>
void *my_memcpy(void *restrict dst, const void *restrict src, size_t n)
{
uint8_t *d = dst;
const uint8_t *s = src;
while (n--)
*d++ = *s++;
return dst;
}
void *my_memmove(void *dst, const void *src, size_t n)
{
uint8_t *d = dst;
const uint8_t *s = src;
if (d == s || n == 0)
return dst;
if (d < s) { /* ileri kopyalama güvenli */
while (n--)
*d++ = *s++;
} else { /* hedef sonra: geriden kopyala */
d += n;
s += n;
while (n--)
*--d = *--s;
}
return dst;
}Çakışma örneği
char buf[] = "abcdef";
my_memmove(buf + 2, buf, 4); /* "ababcd" : doğru */
/* aynı işlem ileri kopyalayan memcpy ile "ababab" verebilir */Mülakatta konuşulacak noktalar
restrictanahtar kelimesi derleyiciye çakışma olmadığını söyler ve daha agresif optimizasyon sağlar.- Dönüş değeri
dst'dir, zincirleme kullanım içindir. - Performans: Gerçek kütüphaneler hizalı bölgelerde 32/64-bit veya SIMD ile kopyalar, başta ve sonda byte byte ilerler. Hizalanmamış word erişimi Cortex-M0'da HardFault'a yol açar.
- Gömülü ayrıntı: Volatile donanım register'larına
memcpykullanmayın; byte genişliği ve erişim sırası garanti değildir. Büyük kopyalamalarda DMA tercih edilebilir. - Benzer bir soru olarak
strcpyde sorulabilir:while ((*d++ = *s++) != '\0');Ancak sınır kontrolü olmadığı için gerçek koddastrncpy/snprintfveya uzunluğu bilinenmemcpytercih edilir.
İlgili C Programlama soruları
- C dilinde volatile anahtar kelimesi ne işe yarar?
- Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.
- Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?
- Endianness nedir? Little-endian ile big-endian farkı nedir?
- Bit field nedir? Donanım register'larına erişimde bit field mi yoksa bit maskesi mi kullanılmalı?
- Fonksiyon pointer'ları ve callback tabloları gömülü sistemlerde nasıl kullanılır? Bir state machine örneği verin.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.