Cha*_*hap 5 c++ string pointers constants
我正在尝试优化我编写的一些代码来处理应用程序协议的多个层。我自由地使用了该类std::string,并力求简单而不是过早的优化。该应用程序太慢了,并且valgrind和gprof显示,当缓冲区在堆栈中向上移动时,我花费了大量时间来复制构造字符串。
在我看来,将字符从系统缓冲区复制到最低的应用程序缓冲区后,我应该能够避免再复制数据:毕竟,它在向上移动堆栈时不会发生变化。
我的协议格式是一种“传输”,由一个或多个换行符终止的记录组成,每个记录由多个制表符分隔的字段组成,并以特殊标记终止。例如
RECORD 1\tHAS\tTHESE\tFIELDS\nRECORD 2\tLOOKS\tLIKE\tTHIS\nEND-OF-TRANSMISSION\n
Run Code Online (Sandbox Code Playgroud)
这将被组装在一个std::string名为 input_buffer 的单个缓冲区中。
传输的处理包括从缓冲区中提取记录并将其传递到下一层;从记录中提取字段向量并将其传递到下一层;将字段存储到映射中。在每个阶段,当分配新的 std::string 时,都会复制数据。
是否可以将一个 const 字符串从索引分配到 input_buffer 中,并分配一个长度...而不进行任何复制?例如,RECORD 2 从偏移量 26 开始,长度为 24 个字符:
const std:string record (substr(input_buffer, 26), 24 );
Run Code Online (Sandbox Code Playgroud)
我不熟悉字符串对象的内部结构,但它的性能保证似乎意味着某个地方有一个简单的字符序列,并且几乎毫无疑问有一个指向这些字符内存的指针。该指针是否可以初始化为属于另一个字符串的内存?
(我的编译器是 g++ 4.7,但如果这需要 4.8,我也很乐意了解这一点。)
据我了解,这听起来像是boost::string_ref的一个很好的候选者。您只需这样做boost::string_ref input(input_buffer); ,然后将string_refs 向上传递到堆栈即可。您唯一需要担心的是保持原始缓冲区始终处于活动状态。
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |