Копирование двух несвязанных структур друг с другом через void *
будет работать правильно, только если две структуры имеют одинаковую структуру памяти. В противном случае копирование не удастся.
Обратите внимание, что объекты структуры A
и B
в приведенном выше коде будут иметь одинаковую структуру памяти, поскольку переменные-члены идентичны.
Копирование через void *
работает, потому что вы просто копируете фактическую память, занятую одним структурным объектом, в память, занятую другим структурным объектом.
По сути, плохая идея копировать две несвязанные структуры таким образом.
Рассмотрим ситуацию, когда у вас есть элементы-указатели внутри вашей структуры, memcpy
просто вызовет поверхностную копию элементов-указателей, и если один из объектов завершит свое время жизни, то в конце концов другой объект останется с висящим указателем члена. Это в конечном итоге приведет к неопределенному поведению (скорее всего к аварийному завершению).
Как хранятся методы? Где хранятся данные?
Нормальная функция (не виртуальная) будет храниться где-то в разделе кода программы. Это расположение одинаково для всех экземпляров класса / структуры и, следовательно, оно не является частью распределения памяти каждого объекта класса / структуры.
В случае виртуальной функции-члена размер класса / структуры действительно зависит от наличия виртуальных функций, тогда каждый объект класса / структуры имеет специальный указатель, называемый vptr
внутри каждого this
. Обратите внимание, что это детали реализации компиляторов, и компиляторы могут по-своему реализовать его.