Я изучил семантику C++ 11 move, и у меня есть такой вопрос.C++ 11 move semantics vs C++ 98
Например:
, если у нас есть
vector<T> vt; // also assume that T have pointers on data in separate memory
vt.push_back(...);
предположить vt
не хватает неиспользуемых мощностей. Затем в C++ 98 ему будет выделено больше памяти и скопируйте (вызовите конструкторную копию) для каждого объекта T с данными, на которые они указывают.
Например:
t1 -> данные t1 => будут скопированы t_cop1 -> (данные t1_cop1) t2 -> t2 данные => t_cop2 -> (t2_cop2 данные)
C++ 11 ходов семантика позволяет перемещать все объекты T (просто скопировать указатели, но не копировать данные в отдельной памяти, вызвав конструкторы перемещения).
Итак, вопрос в том, почему мы не можем сделать то же самое в C++ 98, почему мы не можем реализовать push_back только для копирования памяти (которая содержит указатели t1, t2, поэтому t_cop1 и t2_cop2 будут созданы с теми же указателями) и после этого освободите его (t1 и t2, используя, например, free(void*)
)?
UPD: Хорошо, я попытаюсь объяснить мой вопрос о более простом примере:
Например, если у нас есть класс А, который содержит указатель на некоторые данные структуры данных. Мы реализуем конструктор копирования, которая копирует указатель «данные»
class A {
public:
A() {};
A(const A& a) {
data = a.data;
}
private:
struct Data{};
Data* data;
};
// And I want to implement "move semantics" by calling the copy constructor (that copies just pointer)
A* a = new A();
A* b(a);
// and then somehow free "a" object (but not call the destructor)
free(a); // or a = NULL
Как я понимаю, что это то, что двигаться семантика практически сделать (но оставить в некотором целостном состоянии). Так что, как я думаю, у нас действительно была возможность реализовать переход на старом C++. Не так ли?
Также мы можем сделать то же самое и в предыдущем примере с вектором
Я думаю, что вы не поняли семантику перемещения ... –
Здесь нет разницы между C++ 11 и C++ 98, потому что при перемещении указателей только что скопированы указатели. Также 'vector', где 'T' - это указатель, будет перемещаться только по указателям и никогда не указывать указатель. –
nwp
Exectly, но C++ 98 вызовет глубокую копию, чтобы скопировать не только указатели, но и все данные, на которые указывают указатели. Поэтому возникает вопрос, почему мы не можем реализовать семантику перемещения с помощью C++ 98 – Nikita