Здравствуйте, 1234, Вы писали:
1>Здравствуйте, Анатолий Широков, Вы писали:
1>>>memmove, memcpy and e.t.c.
АШ>>Таким способом можно переносить объекты только POD-типов. Приведенный вами класс POD-типом не являетс
1>Уточню.
1>Т.е. вы утверждаете что класс
...
1>копировать используя memcpy/memmove нельзя ?
Формально — нельзя, т.к., как уже было сказано, он не является POD-типом. И ограничение это накладывается стандартом языка.
Практически же копирование с использованием memcpy/memmove для подобных классов во многих случаях (читай на многих платформах) работать будет. Другой вопрос — стОит ли пренебрегать стандартом...
1>Тогда возникает второй вопрос. (хотя на самом деле для меня именно он был первым).
1>Возможно я чего-то непонимаю, но спускаясь по дереву вызовов stl::vetor::insert()
1>я попадаю в конце концов в место где вызывается memmove. Так или иначе вектор сдвигает элементы которые находятся старше предпологаемого индекса вставки. (всем понятно что таких операций нужно старатся избегать в векторе, сейчас вопрос не в этом)
1>Тогда получается что вектор нельзя инстанировать ничем иным кроме "старых добрых простых"типов.(POD)
Вектор может использовать специализированные алгоритмы (в том числе и с использованием memcpy/memmove) для POD-типов. Для не-POD он должен выполнять поэлементное копирование. Если у тебя vector<не-POD-тип>::insert использует memmove, то это очень странно. Было бы интересно узнать — что за компилятор, и что за реализация STL.
1>Я бы хотел для себя прояснить этот момент так же с позиции почему может быть опасно двигать в памяти объект если у него нет таблицы виртуальных функций ?
У объекта нет таблицы виртуальных функций, у него есть указатель на нее

.
Вот тебе пример:
class bad
{
int n_;
int* p_;
public:
bad() {p_ = &n_; }
void set(int n) { *p_ = n; }
};
Думаю, не нужно объяснять, что произойдет при вызове set для объекта, который был перемещен после создания с помощью memmove ...