Подтвердить что ты не робот

Назначение структуры или memcpy?

Если я хочу реплицировать структуру в другой (в C), то что такое pro & con of:

struct1 = struct2;

против

memcpy(&struct1, &struct2, sizeof(mystruct_t));

Являются ли они эквивалентными? Есть ли разница в производительности или использовании памяти?

4b9b3361

Ответ 1

Обозначение struct1=struct2; не только более кратким, но и короче и оставляет больше возможностей оптимизации для компилятора. Семантическое значение = является назначением, а memcpy просто копирует память. Это и огромная разница в читаемости, хотя memcpy делает то же самое в этом случае.

Используйте =.

Ответ 2

Просмотрите этот разговор по той же теме: http://bytes.com/topic/c/answers/670947-struct-assignment

В принципе, есть много разногласий по поводу угловых случаев в этом потоке о том, что будет делать копия структуры. Это довольно ясно, если все члены структуры являются простыми значениями (int, double и т.д.). Путаница приходит с тем, что происходит с массивами и указателями, и заполняет байты.

Все должно быть довольно ясно, что происходит с memcpy, так как это дословная копия каждого байта. Это включает как абсолютные указатели памяти, относительные смещения, так и т.д.

Ответ 3

Я не уверен в разнице в производительности, хотя я бы предположил, что большинство компиляторов будут использовать memcpy под капотом.

Я бы предпочел назначение в большинстве случаев, его гораздо легче читать и гораздо более явным в отношении цели. Представьте, что вы изменили тип любой из структур, компилятор проведет вас к тем, какие изменения необходимы, либо давая ошибку компилятора, либо используя оператор = (если таковой существует). В то время как второй слепо делал копию с возможностью возникновения тонкой ошибки.

Ответ 4

Нет никакой неотъемлемой причины, по которой лучше быть лучше в производительности, чем в другой. Различные компиляторы и их версии могут различаться, поэтому, если вам действительно интересно, вы можете анализировать и использовать факты в качестве основы для принятия решения.

Прямое задание легче читать.

Назначение - это младший бит, рискованный, чтобы ошибиться, так что вы назначаете указатели на структуры, а не на указатели, на которые указывает. Если вы боитесь этого, вы убедитесь, что ваши модульные тесты охватывают это. Меня не волнует этот риск. (Аналогично, memcpy является рискованным, потому что вы можете получить неправильный размер структуры.)