不分配任何字符内存的常量字符串构造函数?
A const string constructor that doesn't allocate any char memory?
我正在尝试优化我为处理应用程序协议的几个层而编写的一些代码。我自由地使用了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
向上传递到堆栈即可。您唯一需要担心的是始终保持原始缓冲区的活力。
- 将常量字符串添加到非常量字符串是否会给出常量字符串
- 将收到的 usart uint8_t* 数据与常量字符串进行比较
- 为什么文字不是常量(字符串除外)?
- public:静态常量字符串声明/初始化问题
- 如何打印出常量字符串的第一个元素?
- 为什么在类体中无法启动静态常量字符串成员
- 如何从常量字符串初始化 LPWSTR?
- 如何在 C++03 中没有重复代码的情况下在堆栈上创建一个非常量 C 字符串数组?
- 需要帮助理解' 字符串 ltrim(常量字符串 &) ' 的含义
- 从常量字符串到布尔值的隐式强制转换
- 比较字符和常量字符串
- C++ lambda 到 std::函数错误与非常量字符串
- 让每个常量字符串都被引用是好的做法吗?
- 外部常量字符串的链接错误
- 无法初始化静态常量字符串
- 如何更改静态链接库中常量字符串数组的Visual Studio C++初始化顺序
- 对已编译的可执行文件中的常量字符串(例如密码)进行加密
- C++ 构造函数中的常量字符串 &name 和字符串名称之间的差异
- 哪个是正确的:矢量<常量字符串>或常量矢量<string>?
- 为什么字符串在函数参数中作为常量字符串传递