移动构造函数和预增量与后增量

Sco*_*ott 7 c++ constructor move

在C++中,如果你有一个使用移动构造函数"复制"用户定义类型的对象的for循环,如果使用++ii++作为循环计数器,它会有什么不同吗?

我知道这个问题看起来很模糊,但我(我相信)在电话采访中问过这个问题.我不确定我是否正确地理解了这个问题,面试官把这个看作是我不知道答案,并简短地缩短了面试时间.

他能得到什么?

And*_*owl 10

在C++中,如果你有一个for循环使用移动构造函数"复制"用户定义类型的对象[...]

首先,移动构造函数用于移动构造,这通常意味着你不是"复制":你可以实现移动作为复制 - 事实上,一个可复制构造的类也是可移动构造的 - 但是为什么明确定义移动构造函数?

[...]如果你使用++ i或i ++作为循环计数器会有什么不同吗?

这取决于什么i.如果它是一个标量对象,就像一个int,那么根本就没有区别.

i另一方面,如果是类型迭代器,则++i应该更有效(在纯粹的理论基础上),因为operator ++在迭代器本身递增之前,实现不必创建要返回的迭代器的副本.

例如,这里是stdlibc ++如何定义迭代器类型的增量运算符std::list:

_Self&
operator++()
{
    _M_node = _M_node->_M_next;
    return *this;
}

_Self
operator++(int)
{
    _Self __tmp = *this;
    _M_node = _M_node->_M_next;
    return __tmp;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,后缀版本(接受虚拟的版本int)还有更多工作要做:它需要创建要重新生成的原始迭代器的副本,然后更改迭代器的内部指针,然后返回副本.

另一方面,前缀版本只需要改变内部指针并返回(引用)本身.

但是,请记住,在考虑性能时,所有假设都必须通过测量来支持.在这种情况下,我不认为这两个功能之间有任何明显的区别.

  • @Scott:虽然我认为安迪在一个重要的案件中钉了一个案子,但我觉得这个问题(如果你说得对的话)是贫穷的. (2认同)