• Задачка на 500$

    чорд, придётся без реаллок.
    тогда в семь строк ну никак не уместиться.
    Еще как можно.
  • Задачка на 500$

    if ((*dst = (char*)realloc(*dst, src_len + 1)) == 0)
    Это конечно работает как-то (согласен). Но представим на секундочку, что произойдет здесь при оверлапе строк str_cpy(&s, s+5); , если имплементация реаллока отдает память ядру?
    Підтримав: anonymous
  • Задачка на 500$

    Мозга не хватает. Но кажется здесь замешано лучшее предсказание процессором условных переходов.

  • Задачка на 500$

    Стесняетесь оверлапа? Тю. Либце не стесняется, а вы стесняетесь?

  • Задачка на 500$

    Мадам, там еще товарищ внизу жалуется. Поясните ему.

    Підтримав: Katrin Matveevna
  • Задачка на 500$

    /* Release of memcpy(*str_dst + len_dst, str_src, len_src); */
    str_tmp = *str_dst + len_dst;
    while (len_src—)
    *str_tmp++ = *str_src++;
    /* End of string */
    *(*str_dst + len) = 0×00;
    Хоть бы посмотрел как оно у ровных пацанчиков github.com/...cpy.c?source=cc
  • Задачка на 500$

    А с чем конкретно вы не согласны, что вам выслал Ноам?

  • Задачка на 500$

    Сергей! Компания Hola убедительно просит Вас убрать из обсуждений решение задачи Александра Наумова и цитату из ответа ему Ноама. Дело в том, что конкурс продолжается, и это — прямые подсказки тем, кто может в нем участвовать. Спасибо заранее.
    Вот именно. Поэтому я и отреагировал так dou.ua/...ic/8356/#384948 .
    решение задачи Александра Наумова
    не. трэшачок с войдами можно оставить :)
  • Задачка на 500$

    Сергей! Компания Hola убедительно просит Вас убрать из обсуждений решение задачи Александра Наумова и цитату из ответа ему Ноама. Дело в том, что конкурс продолжается, и это — прямые подсказки тем, кто может в нем участвовать. Спасибо заранее.
    Вот именно. Поэтому я и отреагировал так dou.ua/...ic/8356/#384948 .
  • Задачка на 500$

    But it’s not required to use str_free() inside str_cpy() or str_cat().
    А я и не спорю. Полностью согласен с этим утверждением.
  • Задачка на 500$

    Probably str_free() would be more complex than free().
    Да 100%.
    To use str_free() instead of free() isn’t effective solution, believe me.
    Да я может и согласен, но деваться некуда. Из майна его не выкинешь же просто так.
  • Задачка на 500$

    А как узнать если функция упала?

  • Задачка на 500$

    Прикинь сам, а для чего в твоем коде str_free?

  • Задачка на 500$

    Уважаемый, обозвавший меня школьником — может, предложите свой вариант решения?
    Естественно. Но только после того как отправлю и получу ответ.
  • Задачка на 500$

    Хорошо. Выходит мы всегда выигрываем в дикой природе.
    Но в реальном мире реаллок за нас делает выделение новой памяти, копирование из старой области в новую и освобождение старой памяти. Вы же предлагаете в str_cat делать всегда malloc-memcpy, memcpy-free, как я понял, что то же самое что и realloc-memcpy.

  • Задачка на 500$

    Можете скинуть 2 разных тела цикла, а то я вас немного недопонимаю? Не понял просто что с чем вы хотите сравнить.

  • Задачка на 500$

    Не разбирался во всем что вы написали пока.

    Жду бенчмарка в виде

    void* tptr=NULL;
    void* tptr2=NULL;

    for (int it=1; it<1024*1024; it++)
    {
    tptr=realloc(tptr, it);
    if (tptr2!=NULL)
    {
    free(tptr2);
    }
    tptr2=malloc(4095+it);
    }

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>

    #define BILLION 1E9

    int main(int argc, const char * argv[]) {
    struct timespec start, end;
    double diff;

    void *tptr = NULL;
    void *tptr2 = NULL;

    int it = 0;

    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);

    for (it = 1; it < 1024 * 1024; it++) {
    tptr = realloc(tptr, it);
    /*
    if(tptr2 != NULL) {
    free(tptr2);
    }
    tptr2 = malloc(4095 + it);
    */
    }

    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
    diff = (end.tv_sec — start.tv_sec) + (double)(end.tv_nsec — start.tv_nsec ) / BILLION;

    printf("%f", diff);

    return 0;
    }
    Конкретные числа ответа никакого не дадут, но скорость незакоментированной части быстрее закоментированной приблизительно в 3-4 раза.

  • Задачка на 500$

    Ну вот хотя бы так :)

  • Задачка на 500$

    Это все здорово. Но все-же хотелось бы чтобы вы хоть как-то отреагировали на комментарий Александра Наумова (если это он конечно).

  • Задачка на 500$

    Вы наверное спутали постраничное выделение памяти хипа и больших кусков постранично с выделением памяти внтури хипа.
    Я скорее имел ввиду постраничное выделение памяти хипа.
    больших кусков постранично с выделением памяти внтури хипа.
    Вот тут я даже не знаю, занимаються ли таким аллокаторы, и много ли из них.
    Я просто думаю, что если взять банальный гну либцэ и запилить оба варианта реализации задачи на маленьких строках, реаллок победит.
    Хотя бы по этой причине
    www.ibm.com/...n_in_c4?lang=en
    Realloc

    void * realloc ( void * ptr, size_t size );

    ptr: Pointer to a memory block previously allocated with malloc, calloc or realloc, or a null pointer (to allocate a new block)
    size: New size for the memory block, in bytes

    Realloc increases the size of the memory block pointed by ptr. If the current address of the memory block doesn’t has “size” free bytes after it. Realloc allocates a completely new memory block at a different location. So, realloc may move the memory block to a different address, so you might get a different ptr in return.

    When the ptr is NULL, realloc exactly behaves like malloc. It allocated a memory block of size bytes long.

← Сtrl 1234567 Ctrl →