1. Си / Говнокод #6270

    +143

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 07 Апреля 2011

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

    • Ну не хочет человек стек использовать, что уж тут поделаешь.
      Ответить
    • А проверка на то, что в куче еще есть место?
      Ответить
    • Опасный язык.
      Ответить
    • tmp_a => tmp ?
      Ответить
    • Выделять 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;
            Ответить
            • > new void*[1000000];
              > malloc(1000000);

              Редкий суржик Си с плюсами.
              Ответить
          • можно:)
            в исходниках для дельфи модуль System, файл getmem.inc, который в нем инклудится. SysGetMem, SysFreeMem, SysReallocMem.
            Ответить
        • Работает относительно быстро??? На каждой итерации выделять/освобождать память одинакового размера - бессмысленный и беспощадный расход процессорного времени.
          Ответить
          • тестовый же код - родился из реальной задачи - там правда аллокалось меньше, но эффект наблюдался в пожирании памяти. тут подобраны параметры для наглядности
            Ответить
          • да, быстро.
            в разы быстрее, чем HeapAlloc/HeapFree.
            Ответить
    • автор так спешил поделиться говнокодом, что забыл дописать к "tmp" в 7 строчке "_a" и в 10 "_b"
      Ответить

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