Лучше всего копировать с помощью простого присваивания, поскольку оно короче, проще для чтения и имеет более высокий уровень абстракции. Вместо того чтобы сказать (человеку, читающему код) «скопировать эти биты отсюда туда» и попросить читателя подумать об аргументе размера для копии, вы просто делаете простое присваивание («скопируйте это значение из здесь, чтобы здесь "). Там не может быть никаких сомнений относительно того, правильный размер или нет.
Кроме того, если структура сильно заполнена, присваивание может заставить компилятор генерировать что-то более эффективное, поскольку ему не нужно копировать заполнение (и оно знает, где оно), но mempcy()
не делает этого всегда будет копировать точное количество байтов, которые вы указали для копирования.
Если ваша строка является фактическим массивом, то есть ::1006*
struct {
char string[32];
size_t len;
} a, b;
strcpy(a.string, "hello");
a.len = strlen(a.string);
Тогда вы все еще можете использовать простое назначение:
b = a;
Чтобы получить полную копию. Однако для данных переменной длины, смоделированных подобным образом, это не самый эффективный способ выполнить копирование, поскольку весь массив всегда будет копироваться.
Однако следует помнить, что структуры копирования, содержащие указатели на выделенную кучу память, могут быть немного опасными, поскольку при этом вы создаете псевдоним указателя и, как правило, делаете его неоднозначным, кому принадлежит указатель после операция копирования.
Для этих ситуаций «глубокая копия» действительно является единственным выбором, и для этого необходимо использовать функцию.