Няшная / Говнокод #6270 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
void foo()
{
    #define A_LEN 32
    #define B_LEN 40

    void* tmp_a = malloc(A_LEN);
    memset(tmp, 0, A_LEN);

    void* tmp_b = malloc(B_LEN);
    memset(tmp, 0, B_LEN);

    /* ... тело функции ...*/

    free(tmp_a);
    free(tmp_b);
}

Выложил болванку правда, а не сам код, но за то все сразу очень наглядно. При чем дефайны повторяются в каждой функции.

Запостил: Imperfectum Imperfectum, (Updated )

Комментарии (26) RSS

  • Ну не хочет человек стек использовать, что уж тут поделаешь.
    Ответить
  • Выделять malloc-ом по 40 байт - это так Ъ... Руки нужно таким кодерам отрывать. И пришивать на то место, откуда они должны расти. А то потом всякие джависты жалуются на скорость выделения памяти в Си...
    Ответить
    • ну да. кстати borland в свое время для этого прослойку сделал. работает относительно быстро, но иногда криво:
      for(int i = 0; i < 1000000; i ++){
      void *t = malloc(1000000);
      malloc(1); // сохраним, освободим потом
      free(t);
      }
      падает с out of memory на любой версии BCB или delphi.
      Может отдельный топик стоило создать?
      Ответить
      • 1000000 × 1000000 этож дохрена терабайт
        падает отнюдь не от фрагментирования кучи
        Ответить
        • там free(t) стоит.
          аллокается в пике 2М байтов без учета структур менеджера памяти.
          Ответить
          • фрее то я и не заметил
            люто жрет сотни working setа под фрагментированную кучу, но не падает
            Ответить
            • а теперь попробуйте убрать
              void *t = malloc(1000000);
              free(t);
              сразу будет все нормально.
              Ответить
      • освободить потом без адреса ? А что за прослойка, поподробнее бы.
        Ответить
        • ну чтоб не загромождать код половину удалил.
          если больше нравится так:
          void **p = new void*[1000000];
          for(int i = 0; i < 1000000; i ++){
          void *t = malloc(1000000);
          p[i] = malloc(1); // сохраним, освободим потом
          free(t);
          }
          for(int i = 0; i < 1000000; i ++) free(p[i]);
          delete[] p;
          Ответить
        • можно:)
          в исходниках для дельфи модуль System, файл getmem.inc, который в нем инклудится. SysGetMem, SysFreeMem, SysReallocMem.
          Ответить
      • Работает относительно быстро??? На каждой итерации выделять/освобождать память одинакового размера - бессмысленный и беспощадный расход процессорного времени.
        Ответить
        • тестовый же код - родился из реальной задачи - там правда аллокалось меньше, но эффект наблюдался в пожирании памяти. тут подобраны параметры для наглядности
          Ответить
  • автор так спешил поделиться говнокодом, что забыл дописать к "tmp" в 7 строчке "_a" и в 10 "_b"
    Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8