std::memcpy
Főnév
std::memcpy (tsz. std::memcpies)
- (informatika) A
std::memcpya C++ szabványos könyvtárának része, acstringfejlé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. Amemcpyrendkí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
destmutató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::copytú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
memcpyvakon másol. Ez veszélyes, ha nincs 100%-ban kontrollod a bemenetre. - Használata előtt mindig ellenőrizd, hogy a
destterület legalább akkora, mintcount. - 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ó.
- std::memcpy - Szótár.net (en-hu)
- std::memcpy - Sztaki (en-hu)
- std::memcpy - Merriam–Webster
- std::memcpy - Cambridge
- std::memcpy - WordNet
- std::memcpy - Яндекс (en-ru)
- std::memcpy - Google (en-hu)
- std::memcpy - Wikidata
- std::memcpy - Wikipédia (angol)