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

    +1005

    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
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    void bvnr(char *text)
    {
    for(int f=0; f<=strlen(text); f++)
    {
    switch(text[f])
    {
    case 'Q' : text[f] = 'q' ; break;
    case 'W' : text[f] = 'w' ; break;
    case 'E' : text[f] = 'e' ; break;
    case 'R' : text[f] = 'r' ; break;
    case 'T' : text[f] = 't' ; break;
    case 'Y' : text[f] = 'y' ; break;
    case 'U' : text[f] = 'u' ; break;
    case 'I' : text[f] = 'i' ; break;
    case 'O' : text[f] = 'o' ; break;
    case 'P' : text[f] = 'p' ; break;
    case 'A' : text[f] = 'a' ; break;
    case 'S' : text[f] = 's' ; break;
    case 'D' : text[f] = 'd' ; break;
    case 'F' : text[f] = 'f' ; break;
    case 'G' : text[f] = 'g' ; break;
    case 'H' : text[f] = 'h' ; break;
    case 'J' : text[f] = 'j' ; break;
    case 'K' : text[f] = 'k' ; break;
    case 'L' : text[f] = 'l' ; break;
    case 'Z' : text[f] = 'z' ; break;
    case 'X' : text[f] = 'x' ; break;
    case 'C' : text[f] = 'c' ; break;
    case 'V' : text[f] = 'v' ; break;
    case 'B' : text[f] = 'b' ; break;
    case 'N' : text[f] = 'n' ; break;
    case 'M' : text[f] = 'm' ; break;
    )
    }
    }

    Перевод текста в нижний регистр. Можно пугать детей на ночь))

    Запостил: hromjo, 03 Июня 2010

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

    • ошибся, если чё это Си!
      Ответить
      • tolower() с стандартной библиотеке Си нет разве ?
        Забавно ещё, что не по алфавиту, а по клавиатурной раскладке ;)
        Ну, и конечно, баг в условии выхода из цикла. Не говоря уже о вызове strlen() каждую итерацию.
        Ответить
        • Что характерно, не скриптом генерили!
          Ответить
        • > Не говоря уже о вызове strlen() каждую итерацию.

          я думаю, компилятор тут соптимизирует и вывед вызов за цикл. или для этого нужно иметь const char* text наверное?
          Ответить
    • показать все, что скрытоМежду прочим сделано весьма грамотно, копипаста конечно присутствует, но зато выполняется в разы быстрее, чем регулярки или цикл.
      Ответить
      • Какие к чертям собачьим регулярки
        char* p = text;
        while (*p) {
          if (*p >= 'A' && *p <= 'Z')
            *p |= 0x20;
          p++;
        }
        Ответить
        • показать все, что скрытоты что, пониёб? а если там юникод?
          Ответить
          • Ах, да. Тогда только свитчем.
            Ответить
            • причем для всех 65535 символов уникода
              Ответить
          • Юникод в чаре? Я что-то прогулял?
            Ответить
            • это был w_char, просто нам не сказали.
              Ответить
              • Я чет пропустил, какой нафик switch для wchar_t (и подобных) short * короче
                Ответить
              • в параметрах функции показано что есть "text"
                Ответить
              • это был typedef за сценой.
                Ответить
            • нет, ты просто говнокодер. Кто тебе сказал, что char это один байт?
              Ответить
              • точнее 8 бит
                Ответить
                • Я так понял, вы намекаете на те компьютеры, где байт не равен октету.

                  Если я правильно вас понял, и вы именно из-за этого называете тут всех "пониёбами" и "говнокодерами", то вы - убожество.

                  Если пишешь программы, то не надо расчитывать на портируемость на столь экзотические архитекторы, т.к. такой подход сильно ухудшит ваш код не принеся тем самым никакой пользы, в то время как. на тех самых архитектурах никогда использоваться не будет. Например были компьютеры, где байт был равен 6 битам, дак что теперь, расчитывать на то, что если используется char, то он в положительную сторону больше 31 не отсчитывает? Портируемой на столь экзотические архитектуры надо писать только в том случае, если программа предназначается для того, чтобы там работать. И если уж на то пошло, если пишешь портируемой на такие архитектуры, было бы неплохо ещё проверить (отладить) как-нибудь образом, насколько работоспособен твой код на таком компьютере, что в свою очередь повлечёт исправление таких функций, за которые вы тут всех пониёбами называете.

                  Вам люди говорят про стандартные случаи, т.к. тут нигде не указано, что программа писана под какой-нибудь там TMS320VC31.
                  Ответить
                  • нет, он просто не знает сей и намекает на .net где char это два байта (ибо уникод)
                    Ответить
                  • Как раз таки, такой код и является говнокодом, так как не следует стандарту. Да что там стандрату, это вообще у Страуструпа в книге описано.
                    Менее экзотическим случаем, как тут уже говорили, является не ansi кодирока.
                    Так что хватит придумывать отговорки, тут выносят вердикт говнокод или нет. Все костыли, имитирующие то что есть в стандартных либах - говнокод.
                    И не надо отмазываться, типа экзотика и т.п. Если бы turdman добавил, условия при которых его код работает, то можно было бы поспорить.
                    Ответить
                    • Честно говоря, не понял вашу мысль.

                      Попробую ответить по тому, что я мутно понял из вашего поста:
                      1.) Каким именно стандартам и в каком месте какой именно код не соотвествует?
                      2.) Вообще не понял про какие отговорки речь. Отговорки я вижу с вашей стороны. Обосрали всех и вся вокруг, а потом придумываете какие-то нелепые "отговорки" чтобы как-то доказать, что это было обоснованно.
                      3.) Лично я хожу на данный ресурс не для того, чтобы выносить вердикт "говнокод или нет", а чтобы во-первых развлечься прочитав код на основной странице, а во-вторых если повезёт, то узнать что-то новое для себя в коммертариях.
                      4.) По поводу велосипедов (или как вы их назвали "костыли"). Я вот ради эксперимента переписывал помню bcmp(), дак в моих задачах моя реализация работала раза в 3-4 быстрее, чем стандартная. А ведь в некоторых из них сравнение строк у меня составляло ощутимый процент общей нагрузки приложения. Я вообще не считаю априори, что велосипеды - говнокод. Я считаю, что если они вносят какую-то пользу, то они вполне могут быть обоснованы, тут уже стоит вопрос в том, как расставлял приоритеты в стиле программирования.
                      5.) Я не отмазываюсь, я действительно считаю системы, где байт не равен октету крайне редкой экзотикой, поддерживать которую при написании программ для x86/amd64/sparc/sparc64/etc абсолютно невыгодно.
                      5.) Про какие условия в коде turdman-а речь? И прошу заметить, что у него описан кусок кода, а не функция целиком, но тем ни менее мне интересно узнать, что конкретно в данном коде с вашей точки зрения не так.

                      Читали рассуждения Гегеля "Кто мыслит абстрактно?". Если не читали, очень советую прочесть (там всего 2-3 странички). Дак вот вы говорите какие-то абсолютно абстрактные вещи. Другими словами, прошу высказавать хоть какие-нибудь конкретные факты в подобных диалогах.
                      Ответить
                      • Кто сказал, что char обязательно в ansi кодировке?
                        В посте turdman предполагается, что char в кодирвке, в которой финт "|= 0x20" прокатывает.
                        Я против использования таких костылей, что не понятно?
                        Ответить
                        • Ну, например используется в IRCd с поддержкой только кодировок совместимых с данным кодом. Почему нет?
                          Или для управляющего протокола FTP, там тоже совместимая кодировка... Да и почти в каком-либо угодно другом демоне тоже кодировка совместима. Не понимаю проблему.

                          Я дак занимаюсь сетевыми задачами и вижу намного больше задач, где никаких проблем нет, нежели наоборот.

                          Хотя, конечно, при особом желании можно извратнутся и ускорить процесс для длинных строк и делать OR сразу по 0x20202020, а уже хвост по 0x20. Но это уже для какой задачи как выгоднее и у кого какой стиль программирования
                          Ответить
                          • Не надо просто кидаться в крайности, пытайтесь как-нибудь объективно взглянуть и сказать что-нибудь действительно объективное.

                            Вот например процерка на чётность "(i/2)*2 == i" - это говнокод. Т.к. существует возможность получить абсолютно эквивалентный результат намного более оптимальным и наглядным способом. А тот способ upcase-а - пока не обосновано что говнокод, т.к. никто пока не доказал, что нет такой сферы применения данного кода, где он является приемлемым.
                            Ответить
                            • Точено также считали те, кто использовал int для индексации массива.
                              Типа назовите системы где это не заработает.. Потом появились в широком распространении x64, всем кто использовал тот говнокод(и соответственно, нужны были большие объёмы памяти), начали дружно искать места где нужно менять на size_t и т.п., а где по формату нельзя просто заменить на size_t, так как в формате файла жёсткие int'ы.
                              Если на данный момент нет ни одной(широкораспрастранённой) системы, где этот говнокод не будет работать, это не значит, что они не появится в ближайшем будущем.

                              Вот чем, предложенный ранее ctype::tolower плох? почему вас тянет на говнецо?
                              Ответить
                              • 1.) Код turdman-а никогда не устареет, если использовать там, где я перечислил;
                                2.) С массивами абсолютно другая ситуация, т.к. объёмы используемой памяти всё-таки меняются.
                                3.) Чего это вы на личности так грубовато переходите. Я ниразу не сказал, что это приемлемый код.
                                4.) По поводу ctype::tolower, как показывает грубый опыт:
                                Время выполнения с ctype::tolower
                                xaionaro@bellatrix:~$ g++ -O2 t1.cpp 
                                xaionaro@bellatrix:~$ time ./a.out 
                                real    0m4.030s

                                Время выполнения с кодом от turdman:
                                xaionaro@bellatrix:~$ g++ -O2 t1.cpp 
                                xaionaro@bellatrix:~$ time ./a.out 
                                real    0m1.662s

                                К тому же, хоть это мало меняет, но я, честно сказать, забыл, что мы обсуждаем c++ вариант, поэтому ожидал Сишный код.
                                Ответить
                                • Так, если разговор идёт о времени выполнения, то мы уже переходим на конкретные машины, с конкретной архитектурой, с конкретными осями, конкретными компиляторами. Если в g++ (точнее в либах) это как-то долго реализовано, это не значит что везде так.
                                  Если требуется, чтобы данный код работал супер быстро, нужно оптимизировать под конкретное железо, оси и т.п. В этом случае я допускаю применение варианта turdman, но только в том случае, если есть увереность что он работает правильно.
                                  Мы ведь здесь не про оптимизацию говорим? Зачем переводить тему в более выгодное для вашей позиции русло?

                                  Кстате, интересно посмотреть, что в g++(в либах) делается.

                                  Посмотрев в вариант от MSVC 2008, у меня есть догадка почему вариант turdman быстрее, смотрим:
                                  1027583F cmp dword ptr [c],41h
                                  10275843 jl tolower+26h (10275856h)
                                  10275845 cmp dword ptr [c],5Ah
                                  10275849 jg tolower+26h (10275856h)
                                  1027584B mov eax,dword ptr [c]
                                  1027584E add eax,20h

                                  Ясно?
                                  Я допускаю что вариант turdman может непосредственно использоваться в либах - но либы то знают(часто) для какой они платформы.
                                  Ответить
                                  • По поводу msvc, там ещё перед непосредственно конвертированием ещё проверка есть:
                                    if (__locale_changed == 0)
                                    {
                                    return __ascii_towlower(c);
                                    }
                                    else
                                    {
                                    return _tolower_l(c, NULL);
                                    }
                                    Ответить
                                    • И да, это в debug режиме. но всё равно, если либовый вариант медленее варианта turdman, это не значит что он хуже. Это значит, что они разные. А раз они разные, то каждый хорош для конкретной задачи.
                                      Ответить
                                  • Честно говоря, у меня на экране наш диалог ушёл слишком далеко "вправо" и вообще говоря уже неудобно общаться :).

                                    Однако:
                                    1.) Да, я прекрасно знаю, от чего зависит скорость выполнения. ;)
                                    2.) Я не перевожу диалог в другое русло. Я просто ответил, чем может быть плох "ctype::tolower".
                                    3.) По поводу "знают для какой они платформы". Я уже кажется писал про свой эксперимент с bcmp(). То было проведено на linux, где "стандартная библиотека" ещё достаточно шустрая. А вот на FreeBSD разница составила в 7 раз, если я правильно помню.

                                    Я понимаю вашу позицию. Я с ней согласен в особенности, если говорить о коммерческих проектах (где очень важна скорость разработки). Однако я считаю, что программист вполне имеет право (если он достаточно дотошный) делать любой велосипед, если это имеет какое-то обоснование (например значительный прирост производительности).

                                    И я, например, писал код, где я расчитывал как будут работать на велосипеды для 4 архитектур. И считаю, что получилось вполне неплохо, тем более что, при компиляции идёт проверка этих функций, и если видно, что они хуже стандартных или соизмеримы, то выбираются стандартные функции (ну и естественно, их можно флагами отрубить вручную при компиляции). Из-за чего я это делал? Из-за того, что моей целью было сделать хорошо быстродействующий вариант программы.

                                    А по поводу того, как это делается в g++, если хотите, могу дать ssh-доступ к машине с g++ и objdump (для дизассембляции) ;)
                                    Ответить
                                    • у меня есть запущенная линукс машина под рукой. но вот зачем дизассемблировать, если есть исходный код(который даст больше понятия о намерениях его автора). Мне лень искать эти исходники.

                                      Я понимаю вашу позицию. Повторюсь, если turdman сделал бы небольшую сноску, о том где это будет работать, у меня небыло бы никаких вопросов/возражений. Конечно, я понимаю что большинство здесь просто стебается, но всё же было бы неплохой традицией, в спорах находить лучшие варианты, а не просто обсирать сабжи.

                                      Я за использование стандартных(тут я допускаю использование нормальных либ, которые идут на разных платформах типа QT) либ.
                                      Помню недавно пришлось исправлять/дополнять один известный open-source проект, чтобы он нормально заработал в windows, после того как один из разработчиков использовал функции которые были только у g++, в общем не очень приятно возится с таким калом.
                                      Ответить
                                      • Ну, вижу мы друг друга поняли ;)

                                        По поводу дизассембляции, это просто очень удобный способ посмотреть "что за хрень натворил компилятор" :)

                                        P.S.: Кстати, основной мой грех пожалуй в том, что я пишу не под c89 или какой-то чисто сишный стандарт, а под gnu89. Т.е. я привык использовать GNU-расширения :(
                                        Ответить
                                        • "что за хрень натворил компилятор"
                                          Я этим тоже занимаюсь, был приятно удивлён, когда MSVC сам развернул цикл(сделал достаточно длинной итерацию) и использовал sse. Причём порядок операций на первый взгляд был случайным, а оказалось, очень даже оптимизирован под конвееры процессора.
                                          Ответить
                          • И, кстати, хотел бы увидеть ваш вариант.
                            Ответить
                            • Чем плох tolower (я не уверен, может он не в стандарте, но по всей видимости он там есть)?
                              Ответить
                              • tolower есть (C89, C99, 4.3BSD)

                                http://www.opennet.ru/man.shtml?topic=tolower&category=3

                                Предложите вариант использования.

                                А по поводу ctype::tolower я написал в посте выше.
                                Ответить
                                • Ну видите? Есть стандартные средства, зачем костыли?
                                  Я на 90% уверен, что использую стандартные функции ещё можем получить бонус - например если локаль русская, автоматом перевод русских заглавных букв(не проверял, может это не так)
                                  Ответить
                                  • Этот бонус лично в моих задачах вообще нахрен не нужен обычно :).

                                    А по поводу tolower, вы его в цикле собираетесь запускать или как? Хотя я так понял, вы C++-ник, поэтому вряд ли вам будет интересно писать вариант кода для PureC. Однако, к сожелению, tolower надо использовать в цикле. :(
                                    Ответить
                                    • Да, я в основном пишу на C++, не было необходимости писать на C.

                                      (дальше, не в тему)
                                      В чём преимущество использования C? Разве что, для какой-нибудь железки нет компилятора C++.
                                      Аргумент быстрее, не очень состоятельный, ведь на C++ не обязательно использовать ООП, виртуальные функции и т.п. То есть я имею ввиду, какие сейчас аргументы в пользу использования чистого C(действительно интересно, может изучу его для разностороннего взгляда)?

                                      Может сейчас скажу холиварные слова, но разве у C сильно синтаксис отличается? Да, понятно классы, шаблоны и т.п. Но ведь всё-таки процентов 60 кода это именно алгоритмы, а не ООП и т.п.
                                      Ответить
                                      • Я уже солидно подвыпил, поэтому мне впадлу правильно формулировать мысль... Но:

                                        Я использую Си из двух религиозных соображений:
                                        1.) Ради дополнительной близости к низкоуровневым языкам (люблю красивый код "с точки зрения компьютера");
                                        2.) Мне крайне противно как используют ООП современные C++ "программисты", поэтому в знак протеста я пытаюсь стоять со стороны лагеря PureC.

                                        Я сам придерживаюсь той же позиции, что C++ - более качественный язык, чем PureC, однако тот же lowcase строки используя ctype::tolower соотвествуя парадигме c++ работает ощутимо медленее, чем подход PureC. Да и вообще я привык думать, что плюсойды любят стрелять по мухам из базуки. И просто чтобы не заразиться той же болезнью я пишу на Си :).

                                        К тому же, C++ сложнее, программы его компилятся порядком дольше и отлаживать лично мне ООП код сложнее [склад ума у меня такой :(, похоже]

                                        Однако по поводу данного поста прошу заметить две вещи, я сейчас не очень адекватен и я ни коем образом не пытаюсь разжигать холивар, просто хочу дать понять, почему я остался на таком динозавре как C89
                                        Ответить
                                        • согласен полностью... но как только количество строк кода переходит некоторое сферическое число N, С становится сильно сложнее С++...
                                          Ответить
                                          • > но как только количество строк кода переходит некоторое сферическое число N, С становится сильно сложнее С++...

                                            Если писать на си в объектном стиле, то ничуть не сложнее.
                                            Ответить
                                            • А зачем писаь на си в объектном стиле, если есть С++? Зачем изобретать велосипед? Зачем ООПить руками, если есть С++?
                                              Ответить
                                              • Плюс один!

                                                PS. Это другой комментарий.
                                                Ответить
                                              • > Зачем ООПить руками, если есть С++?

                                                ООП это парадигма, а не синтаксис. Поэтому вопрос "ООПить руками" имеет мало смысла с вашей стороны.
                                                Ответить
                                            • Плюс один!
                                              Ответить
                                            • ну этот "объектный стиль" тоже доставляет... к каждому объекту нужно писать Init/Close даже если они не используются, вызывать их после создания/перед удалением... к каждой функции нужно дописать имя объекта, что сделает имена функций очень длинными... нельзя сделать вложенных объектов... если нужно присвоить объект вызывается memcpy, как только присваивание объекта перестает быть тривиальным копированием данных начинают писаться эмуляторы операторов присваивания... и так далее... все что в С++ делается автоматически... поэтому "объектный стиль" лишь немного увеличивает это сферическое N, добавляя при этом кучу кода... но конечно не без плюшек: править/вносить изменения в такой код намного проще... но до С++ все таки далеко...
                                              хотелось бы увидеть в новом стандарте С, перегрузку функций и шаблоны как в С++, это еще сильнее увеличит сферическое N...
                                              Ответить
                                              • > к каждому объекту нужно писать Init/Close даже если они не используются

                                                щито?!

                                                > к каждой функции нужно дописать имя объекта, что сделает имена функций очень длинными..

                                                и что? ты программист или вебкилл? именна нихрена не длинные, нисколько не мешает. Stream_Close(obj) vs. obj->Close() тут разницу увидит только розовый дельфятник какой-нибудь, кому только рюшечки подавай.

                                                > если нужно присвоить объект вызывается memcpy

                                                это не присваивание, а копирование. при присваивании в объектом си тупо присваивается ссылка + рефкаунт. копирование в большинстве случаев нах не нужно.
                                                Ответить
                                                • > щито?!
                                                  это сделает более удобным добавление функционала при проектировании сверху вниз...

                                                  > Stream_Close(obj) vs. obj->Close()
                                                  слишком простые примеры...
                                                  с перегрузкой было бы симпатичнеее
                                                  Close( Stream* stream );
                                                  Close( Other* other );

                                                  > копирование в большинстве случаев нах не нужно.
                                                  да, но остается меньшинство случаев в котором это нужно...
                                                  Ответить
                                                  • > с перегрузкой было бы симпатичнеее
                                                    Close( Stream* stream );
                                                    Close( Other* other );

                                                    перегрузка в большинстве случаев - лишний сахар чтобы сократить код на два слова...

                                                    в обж-с используют CloseWithStream - и никто не умер - тем более - становится более очевидным, что именно вызывается (а в говно-с++-подобном ООП бывает много неоднозначных случаев, связанных с выведенеием нужной сигнатуры (нап. при наследовании) > вызовом не того перегруженного метода).
                                                    Ответить
                                                    • > в обж-с
                                                      обж-с говно чуть более чем полностью, к айфонам и макоси сильно притянуто за уши...
                                                      ну и как бы по соглашению обж-с первый параметр не может быть именован, поэтому имя первого параметра входит в имя метода для наглядности...

                                                      все неоднозначные случаи в С++ это error (или warning) на этапе компиляции...
                                                      Ответить
                                                      • > обж-с говно чуть более чем полностью

                                                        ну а ты говнокодер чуть более чем полностью, и что теперь?
                                                        Ответить
                                            • что такое "писать на С в объектном стиле"?

                                              Си поддерживает модульную парадигму, и она там как-бы дэфакто.

                                              Вместо класса у Вас модуль, вместо объекта -- хендлеры ага
                                              Ответить
                                              • > что такое "писать на С в объектном стиле"?

                                                > Си поддерживает модульную парадигму, и она там как-бы дэфакто.

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

                                                    как я уже сказал, раии с++ с постоянным копированием туда-обратно я бы не советовал совать во все щели... в объектном си присваивание это: obj1 = obj2; REF(obj1); Всё.

                                                    > хочешь создать - вызови функцию инициализации

                                                    new Object() vs. Object_Create(). Ой бида, бида.

                                                    > хочешь удалить - вызови функцию закрытия

                                                    delete obj; vs. Object_Delete(obj);

                                                    ой бида, бида.

                                                    > иначе от такого стиля нет профита...

                                                    ну правлиьно, "самый-самый ООП" нужен только когда нужны обобщения (в с++ это зовётся виртуальными функциями). за остальным у "ООПа" нет особого профита. и ведь всё это не так часто нужно, поэтому и внимательным нужно быть совсем не всюду.
                                                    Ответить
                                                    • я об этом...
                                                      int main()
                                                      {
                                                      Object object;
                                                      Object_Init(&object);
                                                      ....
                                                      if ( some == some_other)
                                                      {
                                                      Object_Close( & object );
                                                      return 0;
                                                      }

                                                      if (some_other)
                                                      {
                                                      Object_Close(&object);
                                                      return 0;
                                                      }

                                                      Object_Close( &object );
                                                      return 0;
                                                      }
                                                      большей части этой функции не будет в С++.
                                                      насчет присваивания - указатель катит не везде, иногда всетаки нужно создать копию... если ты делал динамические строки в С, то должен был столкнуться...
                                                      Ответить
                                                      • ты помешан на объектах в стеке.
                                                        у меня оно будет так:

                                                        void CF_MAIN(void)
                                                        {
                                                           cfObject* object = cfObject_Create();
                                                        
                                                           CF_TRY { }
                                                           CF_CATCH { }
                                                           CF_FINALLY
                                                           {
                                                                CF_UNREF(object);
                                                           }
                                                           CF_END_TRY;
                                                        }
                                                        Ответить
                                                        • поэтому тебя и беспокоят проблемы с медленностью хипа...
                                                          Ответить
                                                          • +1
                                                            Ответить
                                                          • в стеке и инлайново нужно хранить кортеж-подобные объекты (например, Point2D). самодостаточные объекты надо лучше в хипе имхо - так проще и ортогональнее как-то и меньше подробностей реализации и прочего гемора..
                                                            Ответить
                                                            • показать все, что скрыточто за бред... в стеке нужно хранить все что возможно... в хип нужно ложить только долгоживущие объекты...
                                                              Ответить
                                                              • > что за бред... в стеке нужно хранить все что возможно

                                                                кто тебе это сказал? у тебя с++ головного мозга. на деле программисту языка высокого уровня как бы должно быть без разницы, где хранится объект. хоть в регистре, блядь.
                                                                Ответить
                                                                • Вообще я был бы непротив, если бы компилятор С++ сам решал, где разместить объект - в хипе или стеке. Скорость бы не убыло, а скорость разработки бы выросла. :)
                                                                  Ответить
                                                                  • а я был бы против, так как я хочу сам решать где мне хранить данные...
                                                                    Ответить
                                                                    • > а я был бы против, так как я хочу сам решать где мне хранить данные...

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

                                                                    ты щас какую-то бессвязную херь спорол.
                                                                    Ответить
                                                    • >delete obj; vs. Object_Delete(obj);
                                                      Про деструктор слышали ? А про то, что он вызывается автоматически при выходе из области видимости ? Не надо путать объекты, время жизни которых управляется руками с объектами на стеке.
                                                      Ответить
                                                      • > Про деструктор слышали ? А про то, что он вызывается автоматически при выходе из области видимости ?

                                                        с++ крут, в стеке он при выходе за область видимости деструктится, а в куче - нет
                                                        молодец!
                                                        Ответить
                                                        • > а в куче - нет
                                                          для кучи есть auto_ptr, или любой другой объект который в конструкторе примет указатель, а в деструкторе удалит его...
                                                          Ответить
                                                          • для меня это такие же костыли вокруг неровной архитектуры...
                                                            Ответить
                                                            • это вообще-то методы облегчить себе жизнь, фактически сводя сложность работы с С++ к Сшарпу ...
                                                              Ответить
                                              • ну вот например с++ называют "мультипарадигменным", хотя реально на уровне синтаксиса есть только объектно-ориентированная парадигма. "мультипарадигменность" например подразумевает функциональную парадигму тоже, а вот она в с++ скорее костыли и негр в розовых трусах, чем парадигма. вот чистый си в этом смысле в полне такой же мультипарадигменный язык.
                                                Ответить
                                        • Мне было интересно любое мнение, объективное или субъективное..
                                          Конечно объективное ценнее, но хоть так..
                                          Холивар конечно начинать не хочется.
                                          Ответить
                          • 0x20202020 прокатить если все символы в строке это заглавные буквы, андерстенд?
                            всё от конкретной задачи зависит.
                            Ответить
                            • Да, это очень грубый вариант. И годится только для задач проверки введённой команды, которая может состоять только из латинницы, например.
                              Ответить
                      • И кстате забжевый вариант(несмотря на всю убогость), менее говнистый чем вариант turdman
                        Ответить
              • Либо залогинься, либо перестань срать других без повода из под anonoymous-а.

                Лучше назови хотя бы один стандарт Си, где sizeof(char) больше единицы.
                Ответить
                • >назови хотя бы один стандарт Си, где sizeof(char) больше единицы.
                  Мой.
                  Ответить
                • "sizeof gives the size in units of chars. "
                  А теперь перечитай ту срань которую спросил
                  Ответить
                  • И откуда вы это взяли?. В моих документациях "in bytes". И даже если немножно рассудить, то идеологически, sizeof() привызан именно к минимальной ячейке памяти, а не к char. Но из-за того, что во всех стандартах C/C++ char равен одному байту, эти понятия вполне могут отождествляться.

                    Если вдруг не хотите верить моим документациям, то давайте воспользуемся внешним источником. Например, прошу ознакомиться с:
                    http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
                    Страница 92. "in bytes"...

                    И я то прекрасно знаю, что я написал, вы лучше перепрочтите из-за чего я это написал.
                    Ответить
                    • так, читаем твой стандарт:
                      "The sizeof operator yields the size (in bytes) of its operand"
                      Дальше, ты идёшь и протираешь глаза:
                      "When applied to an operand that has type char, unsigned char, or signed char,
                      (or a qualified version thereof) the result is 1"

                      ок, прочитал, и что ты теперь думаешь? что char это восемь бит?
                      дальше делаешь промывку глаз ещё раз, ибо в том же документе:
                      "byte
                      addressable unit of data storage large enough to hold any member of the basic character
                      set of the execution environment
                      NOTE 2 A byte is composed of a contiguous sequence of bits, the number of which is implementationdefined.
                      The least significant bit is called the low-order bit; the most significant bit is called the high-order
                      bit."
                      Всё твой мир рухнул..

                      Итак, твой вопрос: "Лучше назови хотя бы один стандарт Си, где sizeof(char) больше единицы."
                      Ещё раз читаешь, и понимаешь что ляпнул тупость:
                      "When applied to an operand that has type char, unsigned char, or signed char,
                      (or a qualified version thereof) the result is 1"
                      Ответить
                      • Я ещё раз прошу прочитать из-за чего я это написал. И ещё заодно то, что я писал выше.

                        1.) Я никогда не говорил, что sizeof(char) будет когда-либо отличаться от "1". Более того, я как раз доказываю, что он всегда равен единице в стандартах C/C++. Поэтому от человека, который хотел сказать обратное, я потребовал показать хотя бы один стандарт. Другими словами, начало вашего поста вообще не в тему.
                        2.) Я выше писал, что байт может быть 6-битным к примеру. Но так же знаю и другие системы - 9 бит, 32 бита и т.п. Если вы и это не прочли и опять пытаетесь мне что-то доказать, что в определение байта не входит "8 бит", то вы опять немножно не в тему.
                        3.) Вы хоть раз сформулируйте прямо про какую глупость вы говорите. А то всё ходите вокруг да около, а пока что выясняется что вы просто не внимательно читали что я писал.

                        Просто возьмите и почитайте что я написал и перестанье пороть всякую лабуду.
                        Ответить
                        • "Я никогда не говорил, что sizeof(char) будет когда-либо отличаться от "1". Более того, я как раз доказываю, что он всегда равен единице в стандартах C/C++. Поэтому человека, который хотел сказать обратное я потребовал показать хотя бы один стандарт"

                          Где я пытался сказать обратное?

                          Я поясню причину своей критики кода turdman. Как одну из целей данного сайта(может это расходится с мнением его создателей), я вижу высмеиванием жутко костыльного кода(как один из вариантов) и выяснения в ходе обсуждения, какой код является более приемлемым, так сказать профит для всех читающих(и посмеяться, и немного опыта/знаний: что хорошо, а что плохо).
                          Если кто-то предлагает код, который ещё более костыльный(пусть даже в специфических случаях) чем сабжевый, то его(код, саму идею) надо тоже высмеивать и карать, чтобы неопытные программисты потом не использовали эти костыли в реальных программах .
                          Ответить
                          • Нет, вы сказали, чтобы я написал "срань" и мне надо перепрочитать свой пост. Вот этого я не понял. И, кстати, здравых и конкретных аргументов с доказательством против кода turdman-а я тоже не увидел.
                            Ответить
                            • "Лучше назови хотя бы один стандарт Си, где sizeof(char) больше единицы."
                              Зачем вообще было это спрашивать? Весело заявить, что sizeof(char) везде 1, в том случае если бы я сказал что-то неправильно - поэтому и срань, подосрань, подъебон и т.п.? Это вообще к теме мало относится, по-этому ещё раз - срань.
                              " И, кстати, здравых и конкретных аргументов с доказательством против кода turdman-а я тоже не увидел."
                              В этом случае перечитайте вы всё.
                              Может вам разжевать? Где в стандарте написано, что 'A'^'a'==0x20. Понятное дело что есть реализации, где это справедливо, пусть даже такая ситуация в большинстве реализаций. Но раз нет в стандарте - говнокод.
                              Ответить
                              • Так:
                                1.) Про "sizeof(char)" я заговорил из-за "нет, ты просто говнокодер. Кто тебе сказал, что char это один байт?"
                                2.) По поводу "'A'^'a'" я вам уже ответил за 10 минут до вашего поста.
                                Ответить
                                • так, вообще-то я следующим сообщением, сразу ожидая горцев со стандартами, написал "точнее 8 бит". Причём, после того как я это опубликовал, ещё не было ответов на то моё сообщение, которое вы упомянули(плохо что точное время здесь не выводится). Каюсь, там под байтом имел ввиду 8 бит, но зачем лезть в бутылку? Вы разве не видели, что я сразу это исправил?
                                  Ответить
                                  • В связи с тем, что все guest-ы выглядят одинаково, я не понял кто что писал. Поэтому написал на каждый пост свой ответ.

                                    Извиняюсь, конечно, за эту манеру :)
                                    Ответить
                                    • блин, надо было сразу зарегистрироваться. а то чувствую себя как одна из личностей шизофреника.
                                      Ответить
                                      • Да!
                                        Ресурс должен знать своих героев!
                                        Ответить
                                    • Вы из какой вселенной?
                                      Компилятор, коем я пользуюсь поддерживает:
                                      short char

                                      и
                                      long char
                                      Ответить
                                    • А вот любой Си компилятор по стандарту:
                                      char a;
                                      if(sizeof(!a)>1)
                                         beep();

                                      выполнит функцию beep();.
                                      Ответить
                                      • Это обращение было к кому? В связи с тем что мы "глубоко справа", я не вижу к какой ветке это относится.

                                        Тем ни менее, во-первых, лично мой компилятор не понимает что такое "short char" и "long char" и, AFAIK, не должен:
                                        error: both ‘short’ and ‘char’ in declaration specifiers
                                        error: both ‘long’ and ‘char’ in declaration specifiers

                                        во-вторых как "sizeof(!a)" относится к нашему диалогу?
                                        Ответить
                                        • В некоторых компиляторах long char АКА wchar_t
                                          Ответить
                                          • Вы мне объясните, каким образом это вообще относится к тому что тут обсуждалось? В коде ясно написано, что там используется именно "char", а не "long char". А ещё мне очень хотелось бы посмотреть на стандарт, а котором вы сейчас говорите. И не надо говорить, что это просто расширение конкретного компилятора, вы мне дайте стандарт почитать.
                                            Ответить
                                        • У меня
                                          #define char wchar_t
                                          Ответить
                                          • ну, компилятору поступит код от препроцессора:
                                            wchar_t a;

                                            может скинуться в деревенский туалет.
                                            Ответить
                                          • Ну сделайте ещё традиционный:
                                            #define true false
                                            #define int char


                                            или что-нибудь в этом роде, а потом скажите, что половина кода в мире - говнокод, т.к. не расчитано на такой случай. ;)
                                            Ответить
                                      • sizeof(!a) .... а не приведет ли инверсия к типу int в данном случае ? Тогда понятно почему >1
                                        Ответить
                                        • на msvc, нет:
                                          char a;
                                          printf("sizeof=%d",sizeof(!a));
                                          а вот это, да:
                                          char a;
                                          printf("sizeof=%d",sizeof(~a));

                                          Курим RTTI:
                                          char a;
                                          printf("%s",typeid(a).name());
                                          output - char
                                          и
                                          char a;
                                          printf("%s",typeid(!a).name());
                                          output - bool (у чувак может bool не как один char по размеру)
                                          и наконец
                                          char a;
                                          printf("%s",typeid(~a).name());
                                          output - int

                                          , короче, тот крендель у которого beep, пусть выведет
                                          char a;
                                          printf("%s",typeid(!a).name());
                                          Ответить
                                          • сейчас будет вонь, типа что он на Си - ну и пиздуй в Си часть отсюда.
                                            Короче, высеркодер, а ну ка бипни этим

                                            char a;
                                            if(sizeof(a)>1)
                                            beep();

                                            или этим
                                            char a;
                                            a=!a;
                                            if(sizeof(a)>1)
                                            beep();
                                            Ответить
                                          • Поддерживаю guest-а. Только добавлю, что для typeid в gcc нужно ещё добавить в код:
                                            #include <typeinfo>


                                            Лично я вообще не понял к чему был тот "прикол" с beep().
                                            Ответить
                                          • >printf("%s",typeid(~a).name());
                                            output - int
                                            Оооо. Я не знал. Вы мне открыли Америку.
                                            А есть ещё операции, что "портят" тип, кроме ~ ?
                                            Ответить
                                            • >А есть ещё операции, что "портят" тип, кроме ~ ?
                                              Побитовый сдвиг например.
                                              В данных случаях происходит продвижение целочисленного типа.
                                              Ответить
                                              • В угоду скорости убрали логичность... Весёлый язык С++...
                                                Ответить
                                                • в угоду скорости надо на ассемблере писать.

                                                  с++ - язык взаимоисключающих параграфов: не достаточно низкоуровневый, не достаточно высокоуровневый. ни то, ни сё.
                                                  Ответить
                                                  • Боже! Как меня заманали вы - холиварщики. Я лично забил отвечать на данные ветки, т.к. понял, что тут начался очередной бесполезный спор.

                                                    Я думаю, что любой более ли менее квалифицированный программист хорошо знает что есть "Си", "C++" и "ассемблер" и вряд ли нужно писать что хорошо, а что плохо.... А последние хрен знает сколько лет, меня эти диалоги успели ну настолько осточертеть, что не смотря на свою настройчивость я из принципа пытаюсь не отвечать на холиварные посты. А вы всё строчите и строчите... строчите и строчите... :(

                                                    Это относится к множеству веток, а не только к этой.
                                                    Ответить
                                                    • > А вы всё строчите и строчите... строчите и строчите...

                                                      ну ты больше всех нас тут воспринимаешь всё близко сердцу, я посмотрю. флудишь-то больше всех ты )
                                                      Ответить
                                                      • "ну ты больше всех нас"

                                                        У них открылось общество религиозных фанатиков - кидаются на неверных.. скоро будут шахидов с говнобомбами пускать
                                                        Ответить
        • кончил
          Ответить
        • а если это не ansii?
          Ответить
    • не в том ошибся если чё. это не СИ, это баян.
      Ответить
    • показать все, что скрытоВздрочнем на коняшку?
      Ответить
    • показать все, что скрытоЭто таки СИ
      Ответить
      • А вам не фиолетово? Мне дак лично фиолетово.
        Ответить
    • показать все, что скрытоБоянно, но все же - где ЗДЕСЬ С++?!
      Ответить
      • Внимательно посмотрите на строку с "for"... Та строка будет воспринята либо компиляторами C++, либо компиляторами Си по стандарту C99 и выше. Т.е. во многих местах стандартный C89 (например gcc до сих пор by default использует стандарт "gnu89") немного не поймёт что имелось ввиду.
        Ответить
    • Будем пугать детей на ночь, а чо)
      Ответить
    • Похоже у школья начались каникулы.
      Школота, а не пора ли в летний лагерь собираться?
      Ответить
    • показать все, что скрытогде здесь C++?!
      Ответить
    • А главное-то говно и не заметили
      for(int f=0; f<=strlen(text); f++);
      Ответить
      • показать все, что скрытонормальный компилятор заменит вызов strlen на константу, или в дельфи у вас не так?
        Ответить
        • С чего бы ему заменять на константу? Тем более если аргумент не константа.
          Ответить
        • В Дельфи у нас всегда границы цикла вычисляются один раз, перед циклом, и это часть стандарта. Даже если верхний предел - не константа.
          А вот в Сях... Absolut уже сказал.
          Ответить
          • показать все, что скрытотому що в паскале размер строки зхраница в первом байте
            и потому строка статическая, ограниченная

            а в сях -- сами знаете

            в дельфях длиной строки не сделать, потому на нем и не пишут серьезного софта
            Ответить
            • Ложь, пиздеж и провокация :) Pascal с Delphi не путаем, ага.

              AnsiString, also called a long string, represents a dynamically allocated string whose maximum length is limited only by available memory.

              A long-string variable is a pointer occupying four bytes of memory. When the variable is empty--that is, when it contains a zero-length string--the pointer is nil and the string uses no additional storage. When the variable is nonempty, it points a dynamically allocated block of memory that contains the string value. The eight bytes before the location contain a 32-bit length indicator and a 32-bit reference count. This memory is allocated on the heap, but its management is entirely automatic and requires no user code.

              Because long-string variables are pointers, two or more of them can reference the same value without consuming additional memory. The compiler exploits this to conserve resources and execute assignments faster. Whenever a long-string variable is destroyed or assigned a new value, the reference count of the old string (the variable's previous value) is decremented and the reference count of the new value (if there is one) is incremented; if the reference count of a string reaches zero, its memory is deallocated. This process is called reference-counting. When indexing is used to change the value of a single character in a string, a copy of the string is made if--but only if--its reference count is greater than one. This is called copy-on-write semantics.

              © Delphi 7 Help
              Ответить
            • http://lurkmore.ru/%D0%A1%D0%B5%D1%80%D1%8C%D0%B5%D0%B7%D0% BD%D1%8B%D0%B9_%D0%B1%D0%B8%D0%B7%D0%BD% D0%B5%D1%81 ?
              Ответить
            • Нет, потому что такой стандарт - границы цикла вычисляются один раз. И с длиной строк в дельфях всё в порядке, внутренее устройство Stalker уже написал, на всякий случай переведу на русский: длина хранится по смещению -4 от начала строки (но обращаться напрямую к ней нафиг не надо, есть функция Length, вот только херово, что она не заинлайнена в D7, в D2009 не знаю), а счётчик ссылок по смещению -8 от начала строки. Если принудительно туда ничего не писать (а в нормальной программе такого не бывает, а если и есть, то ловится опцией Range Checking Error), то есть не ломать счётчик ссылок, то строки сами удаляются, когда становятся не нужны.
              Ответить

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