abc*_*987 6 c++ stl copy-and-swap
我最近在StackOverflow上读到了关于什么是复制和交换习语的答案?并且知道复制和交换习语可以
避免代码重复,并提供强大的异常保证.
但是,当我查看SGI STL deque
实现时,我发现它没有使用这个成语.我想知道为什么不,如果成语在某种程度上像一个"最佳实践"?
deque& operator= (const deque& __x) {
const size_type __len = size();
if (&__x != this) {
if (__len >= __x.size())
erase(copy(__x.begin(), __x.end(), _M_start), _M_finish);
else {
const_iterator __mid = __x.begin() + difference_type(__len);
copy(__x.begin(), __mid, _M_start);
insert(_M_finish, __mid, __x.end());
}
}
return *this;
}
Run Code Online (Sandbox Code Playgroud)
您显示的代码不会重新分配内存,除非容器需要增长,这可能是一个显着的节省.复制和交换总是分配内存来执行复制,然后释放现有元素的内存.
考虑一下deque<vector<int>>
deque的现有矢量成员具有大容量的位置.
deque<vector<int>> d(2);
d[0].reserve(100);
d[1].reserve(100);
Run Code Online (Sandbox Code Playgroud)
使用SGI STL实现,为每个元素分配会保留该容量,因此如果向量需要增长,则可以在不分配任何内容的情况下执行此操作:
d = deque<vector<int>>(2);
assert(d[0].capacity() >= 100);
assert(d[1].capacity() >= 100);
d[0].push_back(42); // does not cause an allocation
Run Code Online (Sandbox Code Playgroud)
复制和交换将使用没有备用容量的新元素替换现有成员,因此上面的断言将失败,并且push_back
需要分配内存.这会浪费时间解除分配和重新分配,而不是使用已经存在的完美记忆.
复制和交换是一种非常容易获得异常安全性和正确性的便捷方式,但不一定尽可能高效.在像STL或C++标准库这样的代码中,您不希望为了稍微简单的实现而牺牲效率,并且这些代码通常应该由能够通过"艰难的方式"实现异常安全的专家编写. "不仅仅是最方便的方式.
归档时间: |
|
查看次数: |
193 次 |
最近记录: |