考虑一个insert(iterator position, const value_type &x)调用:如果没有发生重新分配(容量!=大小),那么在向量的许多实现中我看到了这种行为:
...
template<typename _Tp, typename _Alloc>
void
vector<_Tp, _Alloc>::
_M_insert_aux(iterator __position, const _Tp& __x)
#endif
{
...
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
{
this->_M_impl.construct(this->_M_impl._M_finish,
_GLIBCXX_MOVE(*(this->_M_impl._M_finish
- 1)));
++this->_M_impl._M_finish;
#ifndef __GXX_EXPERIMENTAL_CXX0X__
_Tp __x_copy = __x;
#endif
_GLIBCXX_MOVE_BACKWARD3(__position.base(),
this->_M_impl._M_finish - 2,
this->_M_impl._M_finish - 1);
#ifndef __GXX_EXPERIMENTAL_CXX0X__
*__position = __x_copy;
...
Run Code Online (Sandbox Code Playgroud)
为什么不分配*__position给__x?创建副本不会导致额外的空间浪费吗?难道就不能避免创建副本吗?
__x_copy仅当__GXX_EXPERIMENTAL_CXX0X__未设置宏时才使用。这意味着它仅在 C++98 和 C++03 模式下使用。
如今,您可能不应该无缘无故地使用这些旧模式。
宏名称还表明您有 libstc++ 的旧副本。它于 2012 年被替换:https://gcc.gnu.org/git/?p =gcc.git;a=commit;h=734f50238f863ae90d2e8caa2323aaa02380ff48
在移动容器的元素以释放新元素应插入的位置之前,__x会创建一个副本,因为它可能__x引用容器中可能在此操作中重新定位的元素,从而使引用无效。至少在我看来是这样的。
如果我没记错的话,如果没有另外说明的特定先决条件,过去和现在都允许将对同一容器的元素的引用传递给其成员函数,只要这些是左值引用,而不是右值引用。
| 归档时间: |
|
| 查看次数: |
238 次 |
| 最近记录: |