【问题标题】:C dynamic string lengthC 动态字符串长度
【发布时间】:2009-03-22 20:48:00
【问题描述】:

在 C 中创建动态字符串有不同的方法(长度不断变化)。经过一些谷歌搜索,这样做的主要方法是使用realloc()

我实现这一点的一种方法是为每个节点使用带有 32 字节块的链表。

我想知道除了使用 realloc() 和链表之外是否有更好的方法来解决这个问题,以及每种方法的优缺点是什么。

EDIT 我这样做的原因是因为我正在从套接字recv() 接收动态数据,并且正在寻找一种灵活的存储方式,无需分配大量不需要的数据。

【问题讨论】:

  • 如果您发布了为什么这样做会有所帮助。您实际上已经编写了一个小型内存管理器,我看不出您会从中获得什么特别的好处(只有问题)
  • 好的,我添加了原因。这也是一个有趣的话题,人们可以理解,可惜它被否决了。
  • 有它有趣的原因,没有它奇怪的原因......

标签: c string dynamic


【解决方案1】:

您可以重新分配到不同的预定义大小。例如,当缓冲区已满时,将其大小加倍。

使用链表是个好主意,但数据不连续(例如,您不能将整个结构传递给printf)并且索引需要更多计算(O(N))。一个主要优点是附加字符串(在任一端)是 O(1)。

【讨论】:

    【解决方案2】:

    我认为您正在寻找Scatter-Gather I/O,您要寻找的功能是readv()

    【讨论】:

      【解决方案3】:

      使用 32 字节块意味着数据和开销之间的比率很糟糕 - 您的指针在链表中,并且至少(可能更多)来自内存分配器。我强烈建议分配更大的内存块并以指数方式增长以适应并查看这是否会导致问题。只有遇到问题我才会走链表路线。

      【讨论】:

        【解决方案4】:

        如果你确实使用了 realloc(),不要在每个 realloc 上添加恒定数量的空间,因为这样生成长度为 n 的字符串的成本将是 O(n^2)(realloc 可能会分配一个新区域并在那里复制数据,即它的复杂性不是恒定的,而是 O(n))。最简单的方法是在每个 realloc 上将缓冲区大小加倍,然后摊销成本仍然是 O(n)。

        【讨论】:

        • Realloc 可以利用内存页。如果一个页面是 8k,而一个字符串是 17k,则 16k 可以在两个 8k 页面中,而另一个 1k 可以移动。不过,它比这更复杂。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多