Скажем, у меня есть класс, что-то вроде следующего:
class MyClass
{
public:
MyClass();
int a,b,c;
double x,y,z;
};
#define PageSize 1000000
MyClass Array1[PageSize],Array2[PageSize];
Если мой класс не имеет указателей или виртуальных методов, безопасно ли использовать следующее?
memcpy(Array1,Array2,PageSize*sizeof(MyClass));
Причина, по которой я спрашиваю, заключается в том, что я имею дело с очень большими коллекциями выгружаемых данных, как описано здесь, где производительность имеет решающее значение, а memcpy предлагает значительную производительность преимущества перед итерационным назначением. Я подозреваю, что это должно быть хорошо, поскольку указатель 'this' является неявным параметром, а не чем-либо сохраненным, но есть ли другие скрытые гадости, о которых я должен знать?
Изменить:
В соответствии с комментариями sharptooths данные не содержат никаких дескрипторов или аналогичной справочной информации.
Как и в комментарии Paul R, я профилировал код, и в этом случае избежать создания конструктора копии в 4,5 раза. Часть причины здесь заключается в том, что мой шаблонный класс массива несколько более сложный, чем приведенный упрощенный пример, и называет место "новым" при распределении памяти для типов, которые не позволяют мелкого копирования. Это фактически означает, что вызывается конструктор по умолчанию, а также конструктор копирования.
Второе редактирование
Возможно, стоит отметить, что я полностью согласен с тем, что использование memcpy таким образом является плохой практикой и его следует избегать в общих случаях. Конкретный случай, в котором он используется, является частью высокопроизводительного шаблонного массива класса, который включает в себя параметр AllowShallowCopying, который будет вызывать memcpy, а не конструктор копирования. Это имеет большие последствия для операций, таких как удаление элемента вблизи начала массива и подкачки данных в и из вторичного хранилища. Лучшим теоретическим решением было бы преобразование класса в простую структуру, но при условии, что это связано с большим количеством рефакторинга большой базы кода, избегая этого, я не хочу этого делать.