C++字符串实现

Mir*_*pas 5 c++ string memory-management

我使用遍布我的代码std :: string对象,其中大多数都是堆栈分配的.我替换了默认的new/delete运算符来检查平均内存分配大小,我很惊讶地看到大多数分配来自std :: string,这非常重要,它们在12到32个字节之间!为了优化这一点(从免费存储分配的大量小字符串),我提出了一个简单的解决方案:

  • 实现自定义字符串类
  • 在其中添加固定大小的预定义缓冲区,例如64字节(我可以在分析后调整此大小)
  • 当字符串的长度小于64字节时使用预定义的缓冲区,或者从空闲存储区为较大的字符串分配新的缓冲区.

通过这个实现,我将为所有字符串添加64字节的内存开销,长度> 64,对64字节以下的字符串也增加(64-lenth)开销,但是我将阻止对小字符串的所有分配.

你尝试过这样的方法吗?添加这种内存开销是否合理,大多数时候在堆栈上节省分配时间/内存碎片?

这种方法比自定义str :: string分配器更好吗?

pax*_*blo 7

这合理吗?这取决于.除非你发现自己实际上已经耗尽了内存,通过使用std::string或确定了一个真实的(而不是感知的)性能问题,继续分配和释放,你就是在浪费你的时间.

不要误解我的意思,你可以(而且我)通过使用他们无法获得的额外信息,比标准分配器获得了巨大的收益.但是,除非有一个真正的问题要解决,否则最好使用标准方法并将时间花在其他地方.


Vla*_*lad 5

我认为之前已经按照你提到的方式进行了愚蠢的操作:"fbstring是std :: string的替代品.fbstring的主要好处是显着提高了几乎所有重要基元的性能."

https://github.com/facebook/folly/blob/master/folly/docs/FBString.md

这应该很好地优化:

存储策略

小字符串(<= 23个字符)存储在原位而没有内存分配.

中等字符串(24 - 255个字符)存储在malloc分配的内存中并急切复制.

大字符串(> 255个字符)存储在malloc分配的内存中并且懒惰地复制.