2

它的内存浪费与 cpu 利用率问题。

如果我想合并 3 个字符串:

  • 方法1:我应该取所有字符串长度(strlen)然后分配。

    char *s = malloc(strlen(s1)+strlen(s2)+strlen(s3)+1);
    

或者

  • 方法 2:我应该假设1025和分配考虑到我知道字符串永远不会超过 1025 的事实。

    #define MAX 1025
    char *s = malloc(MAX);
    

请建议。

4

8 回答 8

2

为所有 3 个字符串分配内存更好。

但是如果你100%(加粗,因为它非常重要)确保字符串永远不会超过固定长度,那么继续。您必须预见将来是否会添加可能超过最大长度的内容,并且您必须考虑用户输入是否会以任何方式超出限制。

如果您可能不需要所有内容,您还可以分配固定缓冲区并截断字符串的其余部分(如果它太长)。

如果字符串有可能变得很长(数百 MB),那么您不应该使用这种方法。在这种情况下,解决方案取决于您的应用程序。

于 2012-05-28T07:59:52.013 回答
1

您的 malloc 行看起来不错。

假设一个固定长度,您的另一个替代方案的问题是您稍后可能会改变您对固定长度的想法,而无需更改代码中的所有相应问题。

于 2012-05-28T07:57:44.343 回答
1

方法 2:我应该假设 1025 并分配考虑到我知道字符串永远不会超过 1025 的事实。

是的,这绝对是。但你必须百分百确定。如果可以,总是更喜欢自动存储分配。

于 2012-05-28T08:01:19.737 回答
1

坦率地说,如果您要选择 2,那么我建议堆栈分配(而不是 malloc):

#define MAX 1025
char s[MAX];
于 2012-05-28T08:06:00.213 回答
1

我假设所有字符串的总和将 <= 1024?

在这种情况下,您最好为 1024 分配内存(方法 2)。您可以反复使用此内存。

你的方法有问题1;您必须根据该特定实例的总数重新分配内存。如果您担心,这将增加您的 CPU 周期。

于 2012-05-28T08:10:37.620 回答
1

如果你真的知道总大小永远不会超过 1025 或类似的相当小的值,如果可能的话,尽量在堆栈上分配字符串。

OTOH,如果你要使用 malloc,你不妨做一些额外的工作来弄清楚你需要预先分配多少。在这种情况下,当您走 strlen() 路线并担心效率时,至少存储 strlen() 调用的结果,并使用 memcpy() 来构建组合结果字符串而不是 str*() 函数。

于 2012-05-28T08:13:19.707 回答
1

您需要多久执行一次此操作,一次需要在内存中保存多少个目标字符串?有可能这一切都无关紧要。但是,将其放入char *my_strconcat3 (const char *s1, const char *s2, const char *s3);返回新字符串的函数中。然后,如果情况发生变化,您的代码中就只有一个位置需要更改它。

于 2012-05-28T08:49:48.030 回答
1

在C99中,如果字符串不是那么大,我喜欢这个,

 len = strlen(s1)+strlen(s2)+strlen(s3)+1;
 char s[len];

It is called variable-length array in stack which is higher efficiency than malloc who allocates memory from heap.

于 2012-05-28T08:55:25.023 回答