Memcpy

Memcpy

memcpy

memcpy (от англ. memory copy — копирование памяти) — функция стандартной библиотеки языка программирования , копирующая содержимое одной области памяти в другую.

Функция определена в заголовочном файле string.h (а также в mem.h), описывается в стандартах ANSI C и POSIX.

Компания Microsoft планирует отказаться от использования этой популярной функции, по вине которой годами выявлялись проблемы с безопасностью не только в ОС Windows, но и в огромном количестве числе других приложений, написанных на языке C. Ближе к концу 2009 г. Microsoft добавит memcpy(), CopyMemory() и RtlCopyMemory() в список функций, забаненных в соответствии с методикой разработки безопасных программ Secure Development Lifecycle (SDL). Те разработчики, которые хотят создавать совместимые с SDL приложения, должны будут использовать вместо memcpy() функцию memcpy_s, позволяющую указывать размер буфера. Эта команда уже поддерживается в Microsoft Visual C++, однако родной поддержки в компиляторе GCC пока нет.

Содержание

Определение

void *memcpy(void *dst, const void *src, size_t n);

где:

  • dst — адрес буфера назначения
  • srс — адрес источника
  • n — количество байт для копирования

Функция копирует n байт из области памяти, на которую указывает src, в область памяти, на которую указывает dst. Функция возвращает адрес назначения dst.

Области памяти не должны перекрываться (\|src-dst\|\ge n), иначе данные могут быть скопированы неправильно, например таким образом:

 __src___
|        |
1234567890xxxxx
  |__   ___|
     dst

после копирования буфер dst содержит данные отличные от исходных, так как они были разрушены в процессе копирования:

   __dst___
  |        |
121212121212xxx

Что получится на самом деле, зависит от реализации функции (пример относится к одной из реализации приведенных ниже).

Для правильного копирования перекрывающихся областей нужно использовать функцию memmove(). Некоторые реализации memcpy() (например в libc FreeBSD и OpenBSD) делают то же что и memmove(), принуждая работать правильно даже неправильно написанную программу, однако при написании переносимой программы на это надеяться нельзя.

Алгоритм работы и реализации

memcpy() копирует содержимое src в буфер dst, например, так:

int i;
 
for( i = 0; i < n; i++ )
   ((unsigned char*)dst)[i] = ((unsigned char*)src)[i];
 
return dst;

Но данный пример будет работать медленнее чем любая практическая реализация, по причине того что они оптимизированы:

  • не используют индексы, как в примере
  • перемещают за один цикл не один байт, а блок равный машинному слову (2, 4 или 8 байт; 16, 32 или 64 бит), которое копируется процессором за то же время, что и байт. Такой подход наиболее эффективен при копировании данных, выравненых на границу машинного слова
  • иногда используют инструкции процессора для работы с блоками данных (movsX для i386) в этом случае функция пишется с применением языка ассемблера

Пример частично оптимизированной версии:

int i, m;
unsigned long  *wdst = dst;  // текущая позиция в буфере назначения
unsigned long  *wsrc = src;  // текущая позиция в источнике
 
for(i = 0, m = n / sizeof(long); i < m; i++)  // копируем основную часть блоками по 4 или 8 байт
   *(wdst++) = *(wsrc++);                     // (в зависимости от платформы)
 
for(i = 0, m = n % sizeof(long); i < m; i++)             // остаток копируем побайтно
   *(((unsigned char*)wdst)++) = *(((unsigned char*)wsrc)++);
 
return dst;

Данная версия копирует 4 или 8 байт (размер типа long равен 32 битам на 32-битной платформе и 64 на 64-битной) за цикл, но не проверяет выравненности данных.

Пример использования

#include <string.h>
 
unsigned int  array[512];                 // источник
unsigned char byte_array[sizeof(array)];  // буфер назначения
 
memcpy(byte_array, array, sizeof(array));

Ссылки

См. также


Wikimedia Foundation. 2010.

Игры ⚽ Нужно сделать НИР?

Полезное


Смотреть что такое "Memcpy" в других словарях:

  • memcpy — (от англ. memory copy  копирование памяти)  функция стандартной библиотеки языка программирования Cи, копирующая содержимое одной области памяти в другую. Функция определена в заголовочном файле string.h (а также в mem.h),… …   Википедия

  • Restrict — In the C programming language, as of the C99 standard, restrict is a keyword which may be used when declaring pointers. The restrict keyword is a message from the programmer to the compiler saying this is the only pointer to that memory block .… …   Wikipedia

  • String.h — Saltar a navegación, búsqueda string.h es un archivo de la Biblioteca estándar del lenguaje de programación C que contiene la definición de macros, constantes, funciones y tipos de utilidad para trabajar con cadenas de caracteres y algunas… …   Wikipedia Español

  • string.h — es un archivo de la Biblioteca estándar del lenguaje de programación C que contiene la definición de macros, constantes, funciones y tipos de utilidad para trabajar con cadenas de caracteres y algunas operaciones de manipulación de memoria (el… …   Wikipedia Español

  • Vector (C++) — Стандартная библиотека языка программирования C++ fstream iomanip ios iostream sstream Стандартная библиотека шаблонов algorithm …   Википедия

  • String.h — Demande de traduction string.h → …   Wikipédia en Français

  • String.h — Стандартная библиотека языка программирования С assert.h complex.h ctype.h errno.h fenv.h float.h inttypes.h iso646.h limits.h locale.h math.h setjmp.h signal.h stdarg.h stdbool.h stddef.h stdint.h stdio.h stdlib.h …   Википедия

  • setjmp.h — C Standard Library Data types Character classification Strings Mathematics File input/output Date/time Localization …   Wikipedia

  • Setjmp.h — Este artículo o sección necesita ser wikificado con un formato acorde a las convenciones de estilo. Por favor, edítalo para que las cumpla. Mientras tanto, no elimines este aviso puesto el 8 de junio de 2011. También puedes ayudar wikificando… …   Wikipedia Español

  • string.h — <string.h> est l en tête de la bibliothèque standard de C, du langage C, qui contient les définitions des macros, des constantes et les déclarations de fonctions et de types utilisées non seulement pour la manipulation de chaînes de… …   Wikipédia en Français


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»