我在我的代码中使用了所有 std::string 对象,其中大多数是堆栈分配的。我替换了默认的 new/delete 运算符来检查平均内存分配大小,我惊讶地发现大多数分配来自 std::string,这非常重要,它们在 12 到 32 字节之间!为了优化这一点(从免费存储中分配的大量小字符串),我提出了一个简单的解决方案:
- 实现自定义字符串类
- 在其中添加具有固定大小的预定义缓冲区,例如 64 字节(我可以在分析后调整此大小)
- 当字符串的长度小于 64 字节时使用预定义的缓冲区,或者从空闲存储中为更大的字符串分配新的缓冲区。
通过这个实现,我将为长度大于 64 的所有字符串添加 64 字节的内存开销,并向短于 64 字节的字符串添加(64-lenth)开销,但我将阻止所有小字符串的分配。
你试过这样的方法吗?增加这种内存开销是否合理,大部分时间都在堆栈上以节省分配时间/内存碎片?
这种方法比自定义 str::string 分配器更好吗?