我研究过C++ 11移动语义,我有这样一个问题。C++ 11移动语义与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对象(只需复制指针,但不要通过调用移动构造函数将数据复制到单独的内存中)。我们为什么不能在push_back中复制内存(其中包含指针t1,t2,因此t_cop1和t2_cop2将使用相同的指针创建),所以我们不能实现push_back,然后释放它(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
实际上,但C++ 98将调用深度复制,因此它不仅会复制指针,还会复制指针指向的所有数据。所以问题是为什么我们不能实现移动语义的C++ 98 – Nikita