微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – `std :: string`分配是我当前的瓶颈 – 如何使用自定义分配器进行优化?

我正在写一个 C++14 JSON library作为一个练习,并用于我的个人项目.

通过使用callgrind,我发现current bottleneck during a continuous value creation from string stress test is an std::string dynamic memory allocation.精确的瓶颈是从std :: string :: reserve创建的malloc(…)的调用.

我读过许多现有的JSON库,如rapidjson,使用自定义分配器,以避免在字符串内存分配期间的malloc(…)调用.

我试图分析rapidjson的源代码,但是大量额外的代码评论,以及我不太确定我正在寻找的事实,没有帮助我.

>自定义分配器在这种情况下如何帮助?

>是内存缓冲区预先分配在某个地方(其中?静态?)和std :: string从中可用内存?

>使用自定义分配器的字符串与普通字符串“兼容”吗?

>他们有不同的类型.他们必须被“转换”吗? (这是否导致性能受到打击?)

代码说明:

str是std :: string的别名.

解决方法

认情况下,std :: string根据需要从相同的堆分配内存,就像使用malloc或new分配的内容一样.为了从提供自己的自定义分配器获得性能提升,您需要以这种方式管理自己的“块”内存,以便您的分配器可以处理您的字符串要求的内存量比malloc快.您的内存管理员将在引擎盖下相对较少地调用malloc(或新的,取决于您的方法),一次请求“大量”内存,然后通过以下内容处理这些(这些)内存块的部分自定义分配器.为了实现比malloc更好的性能,您的内存管理器通常必须根据您的用例的已知分配模式进行调整.

这种事情常常归功于记忆使用与执行速度的老旧的折中.例如:如果您在实际中有一个已知的字符串大小的上限,则可以通过过度分配来提取技巧,以始终适应最大的情况.虽然这浪费了您的内存资源,但它可以减轻更广泛的分配与内存碎片的性能开销.以及为了您的目的进行任何调用realloc基本上恒定的时间.

@sehe是完全正确的.有很多方法

编辑:

为了最终解决你的第二个问题,使用不同的分配器的字符串可以很好地一起播放,并且使用应该是透明的.

例如:

class myalloc : public std::allocator<char>{};
myalloc customAllocator;

int main(void)
{
  std::string mystring(customAllocator);
  std::string regularstring = "test string";
  mystring = regularstring;
  std::cout << mystring;

  return 0;
}

这是一个相当愚蠢的例子,当然,在引擎盖下使用相同的主机代码.但是,它使用“不同类型”的分配器类显示字符串之间的分配.实现一个有用的分配器,提供STL需要的完整接口,而不用伪装认的std :: allocator并不是那么简单. This似乎是一个体面的写作涵盖所涉及的概念.至少在你的问题的背景下,为什么这个工作的关键是使用不同的分配器不会导致字符串的类型不同.请注意,自定义分配器作为构造函数的参数而不是模板参数. STL仍然使用模板(例如重新绑定和Traits)来实现有趣的事情,以使分配器接口和跟踪均匀化.

原文地址:https://www.jb51.cc/c/113234.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐