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

c – 不分配任何char内存的const字符串构造函数?

发布时间:2020-12-16 07:06:37 所属栏目:百科 来源:网络整理
导读:我正在尝试优化我编写的一些代码来处理应用程序协议的多个层.我自由地使用了std :: string类,并且为了简单而不是过早优化而努力.应用程序太慢了,valgrind gprof show我花了很多时间复制构造字符串,因为缓冲区向上移动到我的堆栈. 在我看来,在将chars从系统缓
我正在尝试优化我编写的一些代码来处理应用程序协议的多个层.我自由地使用了std :: string类,并且为了简单而不是过早优化而努力.应用程序太慢了,valgrind& gprof show我花了很多时间复制构造字符串,因为缓冲区向上移动到我的堆栈.

在我看来,在将chars从系统缓冲区复制到最低的应用程序缓冲区之后,我应该能够避免再次复制数据了:毕竟,它在向上移动堆栈时不会发生变异.

我的协议格式是一个“传输”,由一个或多个换行符终止的记录组成,每个记录由几个以制表符分隔的字段组成,并以特殊标记终止.例如.

RECORD 1tHAStTHESEtFIELDSnRECORD 2tLOOKStLIKEtTHISnEND-OF-TRANSMISSIONn

这将被组装在一个名为input_buffer的std :: string中.

传输的处理涉及从缓冲区中提取记录并将其传递给下一层;从记录中提取字段向量并将其传递给下一层;将字段存储到地图中.在每个阶段,在分配新的std :: strings时复制数据.

是否有可能将索引中的const字符串分配到input_buffer,并且长度…没有进行任何复制?例如,RECORD 2从偏移量26开始,长度为24个字符:

const std:string record (substr(input_buffer,26),24 );

我不熟悉字符串对象的内部,但它的性能保证似乎暗示某处有一个简单的char序列,而且几乎无疑是指向那些字符内存的指针.该指针可以初始化为属于另一个字符串的内存吗?

(我的编译器是g 4.7,但如果这是需要4.8的东西,我也很高兴知道这一点.)

解决方法

根据我的理解,这听起来像 boost::string_ref的一个很好的候选人. 你只需要做boost :: string_ref输入(input_buffer);然后将string_refs传递给堆栈.您唯一需要担心的是保持原始缓冲区始终存在.

(编辑:李大同)

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

    推荐文章
      热点阅读