gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:17:59 26 4
gpt4 key购买 nike

我正在尝试优化我为处理应用程序协议(protocol)的多个层而编写的一些代码。我自由使用了 std::string 类,力求简单而不是过早的优化。该应用程序太慢了,valgrindgprof 显示我花费了大量时间来复制构造字符串,因为缓冲区在我的堆栈中向上移动。

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

我的协议(protocol)格式是一个“传输”,由一个或多个以换行符结尾的记录组成,每个记录由几个制表符分隔的字段组成,并以特殊的结尾 token 。例如

RECORD 1\tHAS\tTHESE\tFIELDS\nRECORD 2\tLOOKS\tLIKE\tTHIS\nEND-OF-TRANSMISSION\n

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

传输的处理涉及从缓冲区中提取记录并将其传递给下一层;从记录中提取字段的 vector 并将其传递给下一层;将字段存储到 map 中。在每个阶段,数据都被复制为新的 std::strings 被分配。

是否可以从索引中分配一个 const 字符串到 input_buffer 和一个长度...而不进行任何复制?例如,RECORD 2 从偏移量 26 开始,长度为 24 个字符:

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

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

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

最佳答案

据我所知,这听起来很适合 boost::string_ref .您只需执行 boost::string_ref input(input_buffer);,然后将 string_ref 传递到堆栈中。您唯一需要担心的是始终保持原始缓冲区处于事件状态。

关于c++ - 不分配任何 char 内存的 const 字符串构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20039111/

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