Ugrás a tartalomhoz

std::memcpy

A Wikiszótárból, a nyitott szótárból


Főnév

std::memcpy (tsz. std::memcpies)

  1. (informatika) A std::memcpy a C++ szabványos könyvtárának része, a cstring fejlécfájlban található. Ez egy rendkívül alacsony szintű függvény, amely bináris szinten másol adatokat a memóriában – pontosan és gyorsan. A memcpy rendkívül fontos szerepet játszik olyan helyzetekben, ahol nyers memóriával dolgozunk, például tömbök, struktúrák, fájlok, hálózati csomagok kezelésénél, vagy teljesítménykritikus rendszerekben, ahol minden ciklus számít.



🔧 Alapvető szintaxis:

void* memcpy(void* dest, const void* src, std::size_t count);

Paraméterek:

  • dest: A célmemória címe, ahova másolni szeretnénk (mutató).
  • src: A forrásmemória címe, ahonnan másolni akarunk (mutató).
  • count: A másolandó bájtok száma.

Visszatérési érték:

  • A dest mutatója.



🧠 Működésének lényege

A memcpy szó szerint bájtról bájtra másolja át az adatokat a megadott memóriaterületek között. Nem ellenőrzi, hogy a forrás és a célmemória átfedésben vannak-e – ha igen, meghatározatlan viselkedés történhet. Ilyen esetekre inkább a memmove való.



📌 Példa

#include <iostream>
#include <cstring>

int main() {
    char src[] = "Hello, world!";
    char dest[20];

    std::memcpy(dest, src, strlen(src) + 1); // +1 a null-terminátor miatt

    std::cout << dest << std::endl; // "Hello, world!"
    return 0;
}

📍 Mikor használd?

  • Amikor bináris adatokat másolsz (nem C++ típusokat!).
  • Amikor teljesítmény számít.
  • Amikor garantált, hogy nincs átfedés a forrás és célterületek között.
  • Amikor std::copy túl általános, és kézi optimalizálásra van szükség.



⚠️ Tipikus hibák

1. Átfedő memóriaterületek használata

char buffer[10];
std::memcpy(buffer + 2, buffer, 5); // undefined behavior

➡️ Használj std::memmove-ot ilyen esetben.

2. Típusbiztonság hiánya

A memcpy nem tud semmit a másolt típusok szerkezetéről, így ha olyan típusokat másolsz, amelyek rendelkeznek konstruktorral/destruktorral (pl. std::string, std::vector), az hibás vagy veszélyes lehet.

std::string s1 = "hello", s2;
std::memcpy(&s2, &s1, sizeof(std::string)); // NEM helyes!

3. Nem megfelelő méret

A memcpy nem tudja, milyen hosszú adatot másolsz. Ha rossz méretet adsz meg, buffer overflow vagy adatvesztés történhet.



🔥 Haladó használat

1. Struktúrák másolása binárisan

struct Packet {
    int id;
    char data[10];
};

Packet p1 = {42, "payload"};
Packet p2;

std::memcpy(&p2, &p1, sizeof(Packet));

✅ Ez akkor biztonságos, ha a struktúra nem tartalmaz dinamikusan allokált tagokat vagy virtuális függvényeket.

2. Alacsony szintű optimalizáció

  • Gyakran használják fájl- vagy hálózati I/O bufferek kezelésére.
  • Hardverközeli programozásban (pl. mikrokontrollerek, beágyazott rendszerek).
  • SIMD vagy assembly-vel kombinálva maximalizálható a sebesség.



💡 Alternatívák a memcpy helyett

Használat Alternatíva
C++ objektumok másolása std::copy, értékadás
Átfedéses memóriamásolás std::memmove
String másolás (null-terminált) std::strcpy, std::string
Típusbiztos konténer másolás std::vector::assign, konstruktor



🧪 Teljesítmény

A memcpy gyakran rendkívül gyors, mert sok platformon hardveresen vagy speciális utasításkészlettel (SSE, AVX stb.) optimalizált implementációval rendelkezik. Kompilátorok (pl. GCC, Clang) gyakran inline-olják vagy saját optimalizációt használnak, ha a másolandó méret kiszámítható fordítási időben.



🧬 Memóriabiztonság

  • Nem végez ellenőrzést: a memcpy vakon másol. Ez veszélyes, ha nincs 100%-ban kontrollod a bemenetre.
  • Használata előtt mindig ellenőrizd, hogy a dest terület legalább akkora, mint count.
  • Lehet használni biztonságos wrapperrel:
template<typename T>
void safe_copy(T* dest, const T* src, size_t count) {
    std::memcpy(dest, src, count * sizeof(T));
}

🎓 Összegzés

std::memcpy:

  • 🧱 Alacsony szintű adatmásolás eszköze.
  • 🚀 Rendkívül gyors, ha megfelelően használod.
  • ⚠️ Nem típusbiztos, és hibás használat esetén komoly hibákhoz vezethet.
  • ❌ Nem alkalmas komplex C++ objektumok másolására.
  • ✅ Akkor hasznos, ha pontosan tudod, mit csinálsz, és teljesítménykritikus kódról van szó.