C:分配的内存比需要的多,有什么好处吗?

C:分配的内存比需要的多,有什么好处吗?,c,memory-management,C,Memory Management,我正在从事一个字符串密集型的Windows C项目:我需要将标记字符串从一种形式转换为另一种形式。基本流程如下所示: DWORD convert(char *point, DWORD extent) { char *point_end = point + extent; char *result = memory_alloc(1); char *p_result = result; while (point < point_end) { swit

我正在从事一个字符串密集型的Windows C项目:我需要将标记字符串从一种形式转换为另一种形式。基本流程如下所示:

DWORD convert(char *point, DWORD extent)
{
   char *point_end = point + extent;
   char *result = memory_alloc(1);
   char *p_result = result;

   while (point < point_end)
   {
      switch (*point)
      {
        case FOO:
          result_extent = p_result - result;
          result = memory_realloc(12);
          result += result_extent;
          *p_result++ = '\n';
          *p_result++ = '\t';
          memcpy(result, point, 10);
          point += 10;
          result += 10;
          break;
        case BAR:
          result_extent = p_result - result;
          result = memory_realloc(1);
          result += result_extent;
          *result++ = *point++;
          break;          
        default:
          point++;
          break;
      }
   }

   // assume point is big enough to take anything I would copy to it
   memcpy(point, result, result_extent);

   return result_extent;
}
DWORD转换(字符*点,DWORD范围)
{
字符*点\结束=点+范围;
char*result=memory\u alloc(1);
char*p_result=结果;
同时(点<点\端)
{
开关(*点)
{
案例FOO:
结果\u范围=p\u结果-结果;
结果=内存_realloc(12);
结果+=结果范围;
*p_结果+='\n';
*p_结果+='\t';
memcpy(结果,第10点);
点数+=10;
结果+=10;
打破
案例栏:
结果\u范围=p\u结果-结果;
结果=内存_realloc(1);
结果+=结果范围;
*结果+=*点++;
打破
违约:
point++;
打破
}
}
//假设这个点足够大,我可以复制任何东西
memcpy(点、结果、结果和范围);
返回结果的范围;
}
memory_alloc()和memory_realloc()是假的函数,用来强调我问题的目的。我事先不知道结果“string”会有多大(从技术上讲,我使用的不是C风格的/null终止字符串,只是指向内存地址和长度/范围的指针),因此我需要动态调整结果字符串的大小(它可能比输入大,也可能小)

在我最初的过程中,我使用malloc()为第一个字节/字节创建空间,然后在需要追加另一个字节/少量字节时使用realloc()。这是可行的,但感觉这种方法将不必要地影响操作系统,并可能导致内存中的字节反复移动

因此,我进行了第二次传递,它确定了在单个转换单元(如上面的FOO和BAR案例所示)之后,结果字符串的长度,并选择了“首选分配大小”,例如256字节。例如,如果result_extent是250字节,而我是在FOO的情况下,我知道我需要增加内存12字节(换行符、制表符和输入字符串中的10字节)——而不是重新分配260字节的内存,我将达到512字节,以避免我可能会继续添加更多数据的赌注(这样,我就可以省去对realloc的一些调用)

关于我的问题:后一种想法是合理的,还是编译器/操作系统可能已经为我进行了过早的优化?除了不浪费内存空间之外,根据需要重新分配几个字节的内存是否有好处

我对单个转换实例中可能出现的情况有一些粗略的了解,例如,更糟糕的情况可能是2MB的输入字符串带有几百字节的标记,这将导致每个标记实例向结果字符串添加50-100字节的数据(因此,假设200个realloc将字符串拉伸50-100个字节,再进行100个重新分配,这是由于将数据从输入字符串复制到结果字符串(标记除外)中引起的)


如果您对此有任何想法,我们将不胜感激。您可能知道,
realloc
可以在每次调用时移动您的数据。这将导致额外的副本。在这种情况下,我认为最好分配一个大的缓冲区,该缓冲区很可能足以进行操作(上限)。最后,您可以为结果分配准确的数量,并进行最终复制/免费。这样做更好,而且根本不是过早优化。在这种情况下,IMO使用realloc可能会被视为过早优化。

我认为有一个收支平衡点(如果我需要在内存中存储数千个结构,可能最好采用更保守的分配方法),但这似乎是我希望得到的确认。谢谢!