繁体   English   中英

C 动态字符串长度

[英]C dynamic string length

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM