Re[3]: Можно ли перемещать объекты в памяти ?
От: Bell Россия  
Дата: 28.12.04 18:38
Оценка:
Здравствуйте, 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 ...
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.