加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 通过指针获取装饰char *和char const *:良好的做法?

发布时间:2020-12-16 07:03:58 所属栏目:百科 来源:网络整理
导读:您好我想向公众推荐我做一个字符串类(比如std :: string)的想法,该字符串类具有能够处理客户端提供的缓冲区的功能. 您预见到的危险是什么?这是经典的气味吗? etcaetera 我的意思是这样的: char ext[64] = {0};my::string s(ext,my::string::acquire_RW);s
您好我想向公众推荐我做一个字符串类(比如std :: string)的想法,该字符串类具有能够处理客户端提供的缓冲区的功能.

您预见到的危险是什么?这是经典的气味吗? etcaetera

我的意思是这样的:

char ext[64] = {0};
my::string s(ext,my::string::acquire_RW);
size_t len = s.size();
size_t pos = s.find("zboub");
my::string s2(s);   // uses true (alloc+)copy semantic here.

所以我预见了两个策略:acquire_RW和acquire_RO,允许修改ext中的字符.在任何非const方法的RO情况下,以及必须扩展缓冲区的方法中的RW情况;它会分配&此刻只复制.

在某种程度上,my :: string类型成为char *类型的装饰器.

当然,在装饰器作为客户端的要求之前,要小心不要释放外部缓冲区.

感谢您分享您的疑虑

解决方法

“良好实践”的答案很难.我会说,一般不是很好的做法,但对于一些特定的用例非常好的做法.这一切都取决于您在提供的内存的生命周期内如何信任客户端.一般来说:没有信任.在特殊情况下:好的.

有一个相当重要的事情要考虑性能:

您是否计划使用已分配的字符串变体的隐式共享(带写入和引用计数的副本)?或者你打算使用价值语义(总是复制,永远不参考)?

在多处理器和多线程环境中,值语义是字符串的首选方式.多线程环境中必要的锁定会破坏使用隐式共享的性能提升.

请注意,即使在多线程的情况下,您的建议仍然有意义:从外部存储器到分配的变体(无需锁定),以及从此开始的值语义(也无需锁定),您可以完美地使用写时复制.这是最好的.

我想你的变体在非常具体的用例中运行良好,例如你用一些字符串对一些文件进行内存映射,你不想存储这些小字符串和片段内存的副本.

但是,在一般情况下,我不会担心,只使用std :: string.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读