【问题标题】:Memory-efficient C++ strings (interning, ropes, copy-on-write, etc) [closed]内存效率高的 C++ 字符串(interning、ropes、copy-on-write 等)[关闭]
【发布时间】:2010-11-10 02:30:12
【问题描述】:

我的应用程序存在内存问题,包括复制大量字符串、使用与大量哈希表中的键相同的字符串等。我正在为我的字符串寻找一个基类,以使其非常高效。

我希望:

  • 字符串实习(相同值的多个字符串使用相同的内存),
  • 写时复制(我认为这在几乎所有 std::string 实现中都是免费的),
  • 带有绳索的东西将是一个奖励(对于 O(1)-ish 连接)。

我的平台是 Linux 上的 g++(但这不太重要)。

你知道这样的图书馆吗?

【问题讨论】:

    标签: c++ string performance memory-management


    【解决方案1】:

    写时复制(我认为这在几乎所有 std::string 实现中都是免费的)

    我不再相信这种情况了。当您通过迭代器修改字符串时,写时复制会导致问题:特别是,这会导致不需要的结果(即没有复制,并且两个字符串都被修改)或不必要的开销(因为迭代器不能纯粹根据指针来实现:它们在被取消引用时需要执行额外的检查)。

    此外,所有现代 C++ 编译器都执行NRVO,并且在大多数情况下无需复制返回值字符串。由于这是写时复制语义最常见的情况之一,由于上述缺点,它已被删除。

    【讨论】:

    • 更别提多线程问题了...
    • 另外,一些字符串有一个小的字符串优化,不使用堆,而是使用嵌入的小缓冲区来存储数据。然而,令人惊讶的是,GCC 的默认字符串类 (libstdc++) 确实会在写入时复制。
    • C++ 11 禁止 COW 字符串类
    • @Ghita 这个答案远远早于 C++11。
    • @KonradRudolph 是的,我知道。只是想提一下完整性。这里是堆栈溢出 :-)
    【解决方案2】:

    如果您的大部分字符串是不可变的,Boost Flyweight 库可能会满足您的需求。

    它会做字符串实习,但我不相信它会写时复制。

    【讨论】:

    • 如果我用它来包装 std::string,它看起来不会损害写时复制。
    【解决方案3】:

    Andrei Alexandrescu 的“Policy Based basic_string implementation”可能会有所帮助。

    【讨论】:

    • 这并没有多大帮助,但它仍然很棒。
    • 好久没读了,看到你的帖子突然想到了。
    【解决方案4】:

    看看传奇人物 Paul Hsieh 的The Better String Library

    【讨论】:

    • 这看起来很不错,但它非常缺少迭代器。
    • 我不相信任何库写的说“Bstrlib 在设计上不受内存大小溢出攻击的影响。原因是它对长度溢出有弹性,因为 bstring 的长度限制在INT_MAX,而不是 ~(size_t)0."。还有一个业余爱好者认为自己找到了灵丹妙药,事情就是这样。
    • 它似乎没有提供任何我想要的东西......
    • @MSalters 我认为您在这里将缓冲区溢出与内存大小溢出混淆了。尽管如此,缓冲区溢出部门仍有灵丹妙药,它们被称为数组边界的运行时检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2011-04-30
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2013-09-27
    相关资源
    最近更新 更多