1. C++ / Говнокод #12142

    +24

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    #define TRUE (1)
    #define FALSE (0)
    
    #define internal protected:
    #define external public:
    #define declareSuper(superClass) protected: typedef superClass super

    Оттуда.

    Запостил: LispGovno, 17 Ноября 2012

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

    • После бессмысленного и беспощадного #define interface struct от майкрософт, которое кидал когда-то Дефекейстра, я уже ничему не удивляюсь.
      Ответить
      • ну так то голимый микрософт, а это - очередной убийца std::vector через memmove
        Ответить
        • http://www.gamedev.ru/code/forum/?id=169246
          Ответить
          • > Решил я как то раз провести тест, кто быстрее, stl vector или мои динамические массивы,

            test 1: std::vector time milisec 9.14
            test 2: std::vector reserve time milisec 4.30
            test 3: dynArray time milisec 5218.74
            test 4: dynArrayT time milisec 40157.38

            Ну чтож, автор - адекватный человек, который признал свой велосипед говном, и не постеснялся об этом рассказать.
            Ответить
          • Зато ниже прям слёт пионеров велосипедостроения... спасибо за ссылку, поржал.

            > Обрати внимание - моя реализация близка std::vector (там чуток хуже, но мне подходит)
            Внимание, вопрос: зачем использовать свой вектор, если он медленнее стандартного?
            Ответить
            • интерфейс удобный и расширяемый
              Ответить
              • А что, простите, можно расширять в векторе? Ну разве что счетчик ссылок добавить, как в QVector.
                Ответить
                • Более оптимальное добавление в начало вектора. Использовать более производительные memcpy и realloc если позволяют элементы вектора. Добавить нужные алгоритмы прямо в интерфейс вектора, например:
                  auto iteratorRange = v.filter(std::negate).map(toPair);

                  А не писать крестоблядства:
                  std::vector<decltype(v)> v1;
                  std::copy_if(std::begin(v), std::end(v), std::back_inserter(v1), std::negate);
                  std::vector<std::result_of<decltype(toPair)>::type > v2;
                  std::transform(std::begin(v1), std::end(v1), std::back_inserter(v2), toPair);
                  Надеюсь в последнем я нигде не ошибся, тк это для меня сложно. Если второй вариант кому-то показался удобнее первого, то я, как и Понтий Пилат, умываю руки.
                  Ответить
                  • Блин, std::is_negate нет. std::negate это не то(
                    Ответить
                    • Вместо std::negate нужно написать std::bind(std::less<decltype(v)>(), _1, 0)
                      Блять, да кто это придуман? Назовите имя этого человека? Я трижды кину в него камень.
                      Ответить
                      • Вообщем посоны вот так получается:
                        std::vector<decltype(v)::value_type> v1;
                        std::copy_if(std::begin(v), std::end(v), std::back_inserter(v1), std::bind(std::less<decltype(v)>(), _1, 0));
                        std::vector<std::result_of<decltype(toPair)>::type > v2;
                        std::transform(std::begin(v1), std::end(v1), std::back_inserter(v2), toPair);
                        Ответить
                        • А вот примерно так бы выглядел код, если бы не догадались добавить std::copy_if в с++11 (std::bind ещё поправил, выше он не верно написан):
                          std::vector<decltype(v)::value_type> v1;
                          std::copy(std::begin(v), std::end(v), std::back_inserter(v1))
                          v1.erase(std::remove_if(std::begin(v1), std::end(v1), std::bind(std::greater_equal<decltype(v)::value_type>(), _1, 0)), std::end(v1));
                          std::vector<std::result_of<decltype(toPair)>::type > v2;
                          std::transform(std::begin(v1), std::end(v1), std::back_inserter(v2), toPair);
                          А вы ведь посмотрите насколько это не оптимально, относительно первоначального варианта. Типичное квадратичное говно.
                          Ответить
                          • что ты вообще хотел сделать?
                            перепиши в виде императивного цикла
                            тебе скажет спасибо тот программист, который будет поддерживать твой говнокод после того, как тебя уволят
                            Ответить
                            • Не нужен цикл. Короче так:
                              auto iteratorRange = v.filter(std::negate).map(toPair);
                              Ответить
                              • Сделайте мне редактирование:
                                auto iteratorRange = v.filter(isNegate).map(toPair);
                                Ответить
                              • понаберут по объявлению блять
                                раздел хаскел прямо и направо
                                Ответить
                                • О каком Хаскеле ты говоришь? Тот что Карри? Это как в C#, только названия методов другие.
                                  Ответить
                                  • я не знаю, что за метод такой filter
                                    но подозреваю, что тебе вдруг понадобился boost::filter_iterator
                                    Ответить
                                    • мне помогают мои контейнеры. кресты методы расширения как в сишарпе не осилили
                                      Ответить
                                      • ах, так к нам пожаловал успешный игровой программист-индивидуал
                                        поведай нам больше, как собственный контейнер еще больше приблизил тебя к завершению проекта в срок
                                        Ответить
                                        • я написал контейнеры и стал очень близок
                                          Ответить
                                          • да, дело за малым - написать всё остальное
                                            Ответить
                                            • А ты представляешь себе, если бы я писал всю игр на этом крестоблядском стл-поносе страуса? Насколько бы я был далек от создания игры?
                                              Ответить
                                              • но написать велосивектор ты додумался

                                                если так жжотса в причинном месте, что из крестов делаешь сишарпик, зачем тебе кресты?
                                                Ответить
                                                • шарпик тормозной.
                                                  нужны быстрые высокоуровневые кресты, а не тот детский сад, что ты видел выше.
                                                  Ответить
                                                  • детский сад я вижу только в твоих каментах (и в теме - это же твоих рук дело)
                                                    если ты думаешь, какой ты крутой обдурил систему, сэкономив на конструкторах копирования/перемещения, написав memmove, то ты жестоко ошибся

                                                    нормальные программисты используют вектор так, для чего он предназначен - хранение массива неразрывно
                                                    и говнооптимизацией реаллоцирования не получают даже 0.1% ускорения, потому что это действительно редкая операция ;)
                                                    Ответить
                                                    • >и говнооптимизацией реаллоцирования не получают даже 0.1% ускорения, потому что это действительно редкая операция

                                                      Эта оптимизация уменьшает фрагментацию кучи. А ещё для больших векторов (больше страницы или нескольких) будет использоваться оптимальное, для данного случая, страничное перемещение (просто замена значений в таблице страниц). Ты похоже нуб не в теме?
                                                      Ответить
                                                      • ты дурачок? чем выделение К килобайт неразрывного участка памяти дефолтным аллокатором вектора отличается от выделения К килобайт твоим говновектором в плане фрагментации кучи?

                                                        и поспешу тебя удивить, в нормальных реализациях stl вектор умеет отличать pod от не-pod, используя где нужно memcpy, но гораздо важнее сделать #define TRUE 1, это так проффессионнально, куда уж нам, нубам

                                                        и да, не нубам еще известны специфичные вызовы типа _expand/mremap, позволяющие иногда вырасти существующему выделенному блоку

                                                        ты ведь понимаешь, что вся дополнительная эффективность вектора - в его яйце аллокаторе?
                                                        Ответить
                            • >что ты вообще хотел сделать?
                              Ну вот приехали, крестовики не понимаю код на крестах. Туда куда вели стандарт, туда и пришли.
                              Ответить
    • Гость жжот в этой теме.
      Только крестоблядский стл - это не струасиный понос, а степашкин.
      И это не понос, а удобная библиотека. Конечно, бывают и поудобнее, но СТЛ наиболее убедителен.
      Ответить
      • Ага, и меня гость повеселил. Когда то, что записывается на нормальных языках в одну строчку, а на stl в 5 длинных - это показательно. Только не степашкин понос, а хрюшин.
        Ответить
        • Да потому что пора признать, что С++ это такая сишка, в которой не надо вручную с указателями на строки трахаться, ну и над освобождением ресурсов можно не париться (все обёртки есть в стл). И нехуй пытаться сделать из неё чёрти что.
          И если бы из крестов вообще выпилили шаблоны и автодеструкторы, кроме стл, и вшили бы стл в язык, сделав удобную поддержку со стороны синтаксиса, то для 99% задач кресты от этого только бы стали удобнее.
          Впизду универсальность, возможность "нопейсать свой язык на этом языка" итд, это только мешает писать код блеать.
          Ответить
          • > выпилили шаблоны и автодеструкторы
            Ну и само собой new, delete и всю адресную арифметику. Ибо нехуй.
            Ответить
          • если бы выпилили языковую поддержку шаблонов, засунув стл в язык, то на выходе получили бы сраный делфи 7

            спасибо, не надо
            Ответить
            • > если бы выпилили языковую поддержку шаблонов, засунув стл в язык, то на выходе получили бы православный делфи 7

              Именно, вы прочитали между строк мой тонкий намёк!
              Как я сказал ранее, фишки С++, которых не было в Дельфи-7, не дают видимого ускорения разработки, зато дают +100 к пустомыслию на тему "а правильно ли я сделал, ведь есть какой-то хитровыебанный паттерн, который сделает этот участок кода типобезопасным и без копипасты 5 строчек, и похеру, что это 100 строк нечитаемого шаблонного говна, которые надо ещё неделю отлаживать, читая простыни компилятора, извесного невменяемостью на тему чётко указать, где именно ошибка".
              Ответить
              • так ведь дело в следующем
                если писать однопоточное приложение с глобальными объектами на 10-20к строк, то достаточно и С, даже не дельфи, представь себе
                так что если тебе не пригодились шаблоны, раии, перегрузка операторов и ничего кроме стл (а ведь для своего андроид-ндк ты даже не пытался выйти за рамки стл), если тебе достаточно 2003 студии - так это не значит, что ты есть 99% всех разработчиков
                вот как то так
                Ответить
                • > а ведь для своего андроид-ндк ты даже не пытался выйти за рамки стл

                  А тот эпичный тред?

                  > если тебе достаточно 2003 студии - так это не значит, что ты есть 99% всех разработчиков

                  Ну я как бы примерно сужу по отголоскам того, что я слышу. Хитрожопых шаблонистов не любят.
                  Ответить
                  • > Хитрожопых шаблонистов не любят.
                    Хитрожопых ВООБЩЕ не любят.
                    Ответить
              • Делфьи 7 никогда не были православными, просто слоупоки привыкли не апгрейдиться пока в Броланде пропивали свои активы.
                И IDE не работает на системе с DEP, что очень символизирует.
                Ответить
                • > И IDE не работает на системе с DEP
                  Происки майкрософта. Решили устранить конкурирующую IDE под прикрытием внедрения DEP.
                  Ответить
                  • Может всетаки Интела?
                    Ответить
                    • Ну интел всего лишь добавил бит, а использовать его или нет решали именно майкрософты.
                      Ответить
                • Просто Борланд долго выпускал откровенно сырые версии, поэтому а всякий случай все сидели на семёрке.
                  Ответить
                  • С какой, кстати, версии провославная из новых? XE2?
                    Ответить
                    • Когда там юникод в дельфях запилили?
                      Ответить
                • Вообще странно, что программы на Дельфи вообще там работают, в них же извечная задача "получить объект, соответствующий этому окну" вроде бы решается через самомодифицирующий код (генерация оконной процедуры).
                  Ответить
                  • Ну задача "получить объект, соответствующий этому окну" всегда решается через жопу. Или генерация заглушки, или хеш, или GetProcParam.
                    Ответить
                  • Чё чё? Кусок кода, генерируемого по ходу работы, можно? Не знал, что в Дельфах есть такие космические технологии.
                    Ответить
                    • > космические технологии
                      Это ещё первые виндовсы умели (BitBlt)
                      Ответить

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