7

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

我知道这个问题似乎相当模糊,但我(我相信)在电话采访中被问到这个问题。我不确定我是否正确理解了这个问题,面试官认为这是我不知道答案,因此缩短了面试时间。

他能得到什么?

4

1 回答 1

11

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

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

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

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

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

例如,这里是 stdlibc++ 如何为 an 的迭代器类型定义增量运算符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;
}

如您所见,后缀版本(接受 dummy 的版本int)还有更多工作要做:它需要创建原始迭代器的副本以重新创建,然后更改迭代器的内部指针,然后返回副本。

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

但是,请记住,当涉及性能时,所有假设都必须通过测量来支持。在这种情况下,我不希望这两个函数之间有任何明显的区别。

于 2013-05-09T16:47:48.610 回答