c – 在STL中使用引用计数的数据结构有哪些行为异常?

c – 在STL中使用引用计数的数据结构有哪些行为异常?,第1张

概述“有效STL”中的Scott Meyer说,在决定使用哪种数据结构时要考虑的一件事是容器是否使用引用计数.他说这种方法存在一些行为异常现象. 它们中有哪些是什么?为什么像’string’和’rope’这样的容器有异常行为? 正如其他人所说,典型的例子是std :: string.除了锁定多线程程序的性能问题外,引用计数字符串还存在无线程问题.想象一下: string s = "hello";st “有效STL”中的Scott Meyer说,在决定使用哪种数据结构时要考虑的一件事是容器是否使用引用计数.他说这种方法存在一些行为异常现象.

它们中有哪些是什么?为什么像’string’和’rope’这样的容器有异常行为?

解决方法 正如其他人所说,典型的例子是std :: string.除了锁定多线程程序的性能问题外,引用计数字符串还存在无线程问题.想象一下:
string s = "hello";string t = s;                   // s and t share datachar &c = t[0];                 // copy made here,since t is non-const

问题是非const运算符[]必须复制字符串,如果它是共享的,因为返回的引用可以在以后用于修改字符串(您可以将它分配给非引用字符,但运算符[]不知道它应该表现得有什么不同).另一方面,const运算符[]应该避免复制,因为这将消除引用计数的所有好处(这意味着你总是在实践中复制).

const char &get_first(const string &s) {    return s[0];                // no copy,s is const}string s = "hello";string t = s;                   // s and t share dataconst char &c1 = get_first(t);  // no copy made hereconst char &c2 = t[0];          // copy made,since t is non-const// c1 just got invalIDated (in fact,it's pointing at s[0],not t[0]).s[0] = 'X';printf("%c,%c\n",c1,c2);     // outputs "X,h"

正如您所看到的,这种区别令人困惑,可能会导致意外行为.

这是一篇关于写时复制语义及其对性能的影响的旧文章:http://www.gotw.ca/gotw/045.htm.

这是一个提议,有动机将std :: string更改为不在C 11标准中引用计数:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html.这就是上面的例子所基于的内容.

总结

以上是内存溢出为你收集整理的c – 在STL中使用引用计数的数据结构有哪些行为异常?全部内容,希望文章能够帮你解决c – 在STL中使用引用计数的数据结构有哪些行为异常?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存