gpt4 book ai didi

c++ - 为什么 SGI STL 不使用 copy-and-swap 习惯用法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:29 33 4
gpt4 key购买 nike

我最近在 StackOverflow 上阅读了一个关于 What is the copy-and-swap idiom? 的答案并且知道 copy-and-swap 习语可以

avoiding code duplication, and providing a strong exception guarantee.

然而,当我查看 SGI STL deque implementation ,我发现它没有使用成语。我想知道为什么不,如果这个习语在某种程度上像“最佳实践”?

  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;
}

最佳答案

除非容器需要增长,否则您显示的代码不会重新分配内存,这可以节省大量资金。 copy-and-swap 总是分配内存来执行复制,然后为现有元素释放内存。

考虑一个 deque<vector<int>> deque 的现有 vector 成员具有大容量。

deque<vector<int>> d(2);
d[0].reserve(100);
d[1].reserve(100);

使用 SGI STL 实现,分配给每个元素保留容量,因此如果 vector 需要增长,它们可以在不分配任何东西的情况下这样做:

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

copy-and-swap 会将现有成员替换为没有备用容量的新元素,因此上述断言将失败,并且 push_back需要分配内存。这浪费了时间去分配和重新分配,而不是使用已经存在的完美内存。

copy-and-swap 是一种非常容易获得异常安全性和正确性的便捷方法,但不一定尽可能高效。在像 STL 或 C++ 标准库这样的代码中,你不想为了稍微容易实现而牺牲效率,这样的代码通常应该由专家编写,他们能够通过“困难的方式”正确地获得异常安全"不仅仅是最方便的方式。

关于c++ - 为什么 SGI STL 不使用 copy-and-swap 习惯用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30397807/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com