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

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    char* to_str(int i) {
        char* s = malloc(12);
        sprintf(s, "%d", i);
        return s;
    }

    Как в сишке без RAII принято жить? Пиздец какой-то. Буфер в функцию передавать?

    Что мешает завезти RAII в сишку?

    Запостил: 3_dar, 30 Января 2021

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

    • или буфер, или размер


      RAII сразу требует охулиард всего, так как копирование данных уже больше не копирование, а вызов какого-то кода. А это перехучка половины языка
      Ответить
      • зы: если размер, то конечно на клиентской стороне чистить вилкой
        Ответить
        • Зачем размер? free() не подойдёт?
          Ответить
          • Ну если ты хочешь, чтобы вызываемая сторона работала с кучей, то у тебя есть выбор:

            * передать ей размер, и попросить создать
            * создать самому

            Кстати, в твоем случае можно наверное выделить размер на стеке. Максимальный размер строки INT_MAX в общем понятен заранее, не?
            Ответить
            • Размер определяет функция. Вызывающей стороне достаточно вызвать free.
              Ответить
            • Куча не нужна.

              Можно иметь один статический буфер, содержимое в нём хранится до следующего вызова этой функции. Если его нужно сохранить, сам его копируешь куда-нибудь.
              Ответить
              • Очень хорошо будет работать многопоточность
                Ответить
                • Потоки тоже нинужны.

                  Но можно просто иметь по буферу на поток.
                  Ответить
                  • то есть ты предлагаешь знание о библиотеке потоков и о thread local storage утромбовать в эту функцию?
                    а если потоки создаются, прости господи, динамически?
                    Ответить
                    • Можно выделять буфер при создании потока. Или при каждом вызове этой функции проверять, создан ли для этого потока буфер, и если нет, создать его.
                      Ответить
                      • а как в фугнкции узнать про создание потока?

                        а удалять как?
                        Ответить
                        • > а удалять как?

                          У TLS слотов деструкторы есть (см. FlsAlloc, pthread_key_create).

                          > как в фугнкции узнать про создание потока

                          Слоты у новых тредов рождаются с NULL. Так что просто проверить на NULL и выделить память.
                          Ответить
                        • Из-за тебя Борманд вернулся!
                          Ответить
    • для облегчения жизни память должны выделить внешняя функция и передать указатель буфера в функцию.
      Ответить
      • и размер его не забыть
        Ответить
        • и еще this_arg, n_varargs и собственно varargs
          Ответить
        • размер должны выдать функция куда пихать буфер если указать NULL как буфер
          Ответить
      • говно
        Ответить
        • Не вижу ничего особо говнистого. Уныло конечно писать некоторое количество бойлерплейта, но он довольно легкий. Сишники обычно принихиваются со временем, и им не пахнет
          Ответить
          • В моем примере длину может определять функция. Могу сделать оптимизацию, что если число < 10000, то выделять 7 байт, иначе 11. Теперь это клиент должен делать, или передавать с запасом?
            Ответить
            • Делай как больше нравится, главное задокументируй. Наверное, проще всё таки попросить клиента за тобой почистить
              Ответить

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