【发布时间】:2014-08-16 21:19:02
【问题描述】:
我研究过 c++ 11 移动语义,我有这样一个问题。
例如:
如果我们有一个
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:好的,我会尝试用更简单的例子来解释我的问题:
例如,如果我们有一个包含指向某个数据结构 Data 的指针的类 A。 我们实现了一个复制指针“数据”的复制构造函数
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
据我所知,这就是移动语义几乎所做的(但让 a 处于某种一致的状态)。所以我认为我们实际上有能力在旧的 C++ 中实现移动。不是吗?
我们也可以在前面的例子中用向量做同样的事情
【问题讨论】:
-
我认为你误解了移动语义......
-
这里 C++11 和 C++98 没有区别,因为移动指针时指针只是被复制。还有一个
vector<T>,其中T是一个指针,它只会在指针周围移动,而不会在指针指向的地方移动。 -
执行,但 C++ 98 将调用深度复制,因此它不仅会复制指针,还会复制指针指向的所有数据。所以问题是为什么我们不能用 C++98 实现移动语义
-
@Nikita 不,c++98 不会自动进行深度复制。它只会复制指针值,就像 c++11 一样。
-
这个:open-std.org/jtc1/sc22/wg21/docs/papers/2005/… 解释了为什么
auto_ptr不起作用。
标签: c++ move move-semantics