一个const字符串构造函数,不分配任何char内存?

时间:2013-11-18 02:31:26

标签: c++ string pointers const

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

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

我的协议格式是一种“传输”,由一个或多个以换行符终止的记录组成,每个记录由多个以制表符分隔的字段组成,并以特殊字符结尾令牌。 E.g。

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

这将汇集在一个名为input_buffer的std::string中。

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

据我了解,这听起来像boost::string_ref的好候选人。 您只需执行boost::string_ref input(input_buffer);,然后将string_ref传递给堆栈。你唯一需要担心的是保持原始缓冲区的存活时间。