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

  • restrict anahtar 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 memcpy kullanmayın; byte genişliği ve erişim sırası garanti değildir. Büyük kopyalamalarda DMA tercih edilebilir.
  • Benzer bir soru olarak strcpy de sorulabilir: while ((*d++ = *s++) != '\0'); Ancak sınır kontrolü olmadığı için gerçek kodda strncpy/snprintf veya uzunluğu bilinen memcpy tercih edilir.
  1. C dilinde volatile anahtar kelimesi ne işe yarar?OrtaC ProgramlamaEmbedded
  2. Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.KolayC ProgramlamaEmbedded
  3. Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?OrtaC ProgramlamaEmbedded
  4. Endianness nedir? Little-endian ile big-endian farkı nedir?KolayC ProgramlamaEmbedded
  5. Bit field nedir? Donanım register'larına erişimde bit field mi yoksa bit maskesi mi kullanılmalı?OrtaC ProgramlamaEmbedded
  6. Fonksiyon pointer'ları ve callback tabloları gömülü sistemlerde nasıl kullanılır? Bir state machine örneği verin.OrtaC ProgramlamaEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle