【问题标题】:Efficient string concatenation in CC中的高效字符串连接
【发布时间】:2010-02-16 11:21:13
【问题描述】:

这是我的问题:我有一个数组,其中包含一个命令 a[1],后跟几个命令 args a[2]、a[3]、...

我需要做的是以下

  • 创建一个字符串,由 cmd 和 args 的组合组成 例如:

cmd arg1 arg2 arg3

  • 执行该命令字符串

我会这样做(伪代码):

  1. 预先计算每个 arg 的长度并将其存储在数组中
  2. 获取组合(使用 GNU 科学库)
  3. 计算分配字符串所需的字节大小(cmd + 1 + lengthof arg1 + 1 + argn-1 + 1) (+1 通常用于空白和 at \0)
  4. 的结尾
  5. 使用 strcat 构建字符串
  6. 执行命令字符串

好吧,它有效,但我想知道故意使用 strcat 是否真的有效/正确的方法。

有什么建议吗?

【问题讨论】:

  • 我不明白“组合”到底是什么......?为什么不使用像 execve 这样的东西?
  • 没想到...这可能是更好的解决方案

标签: c string-concatenation


【解决方案1】:

不,使用strcat() 效率不高,因为每次调用它时它都必须遍历字符串才能找到结尾。

如果有的话,最好使用snprintf() 一次性完成所有操作(并且可以在其中压缩您的参数),或者使用直接指针操作自己完成。

当然,为了在实践中发挥重要作用,您确实需要经常运行此命令。

【讨论】:

  • +1 表示snprintfsnprintf 的一个很好的特性是你可以传入一个零长度(甚至可能是一个 NULL 缓冲区地址),它会返回你需要的字节数。一个常用的技巧是用0长度调用snprintf(),使用返回值给malloc()必要的空间,然后使用缓冲区再次调用snprintf()
【解决方案2】:

如果您存储了每个组件字符串的长度,您可以切换到使用带有正确指针偏移量的memcpy,而不是使用strcat,后者不必找到字符串的结尾和每个测试source char 反对'\0',但除此之外,您无法做更多的事情来显着加快串联的创建。

【讨论】:

    【解决方案3】:

    strcat() 以及标准库中的所有字符串操作函数效率低下。这是由于字符串在 C 中的存储方式,即以零结尾,因此每个函数都必须通过遍历每个字符来找到字符串的结尾。

    无论如何,你正在做一个过早的优化:这里的多个 strcat() 调用与命令执行相比会执行得非常快,所以你不必担心你的连接方式的效率。

    在优化部分代码之前,您必须证明它是一个瓶颈,并且优化确实会缩短执行时间。在大多数情况下,不需要优化:根本不值得花时间。

    【讨论】:

      【解决方案4】:

      我会使用sprintf

      【讨论】:

        猜你喜欢
        • 2010-10-11
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        • 2014-10-03
        • 2019-04-13
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        相关资源
        最近更新 更多