不分配任何字符内存的常量字符串构造函数?

A const string constructor that doesn't allocate any char memory?

本文关键字:常量 字符串 构造函数 内存 分配 任何 字符      更新时间:2023-10-16

我正在尝试优化我为处理应用程序协议的几个层而编写的一些代码。我自由地使用了std::string类,并努力简化而不是过早地进行优化。应用程序太慢,并且valgrind&gprof显示当缓冲区在堆栈中向上移动时,我正在花费大量时间复制构造字符串。

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

我的协议格式是"传输",由一个或多个换行符终止的记录组成,每个记录由几个制表符分隔的字段构成,并用一个特殊的令牌终止。例如

RECORD 1tHAStTHESEtFIELDSnRECORD 2tLOOKStLIKEtTHISnEND-OF-TRANSMISSIONn

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

传输的处理包括从缓冲区提取记录并将其传递到下一层;从记录中提取字段的向量,并将其传递到下一层;将字段存储到地图中。在每个阶段,数据都会随着新的std::字符串的分配而被复制。

是否可以将索引中的常量字符串分配到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向上传递到堆栈即可。您唯一需要担心的是始终保持原始缓冲区的活力。