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

    +8

    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
    //список строк
    QStringList rows_list = text.split("\n");
    
    uint32_t row=0;
    uint32_t col=0;
    for(QStringList::iterator itR=rows_list.begin(); itR!=rows_list.end(); itR++,row++)
    {
       QStringList columns_list=itR->split(";");
    
       col=0;
       for(QStringList::iterator itC=columns_list.begin(); itC!=columns_list.end(); itC++,col++)
       {
          //*itC,row,col
       }
    }

    Человек осилил итераторы в с++...
    (для тех, кто не в теме - QStringList имеет доступ по индексу за константное время)
    А еще мне нравятся uint32_t вместо int или, на худой конец, quint32.

    Запостил: ABBAPOH, 22 Февраля 2013

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

    • показать все, что скрытоНука, в чем конкретно говно - просвЯти. Ну кроме явного говна в архитекстуре(это своейственно 98% адептам ООП, ибо зачем им знать всякие "архитекстурозависимые вещи").


      Ну хорошо, осилил, и?



      К чему тут про какой-то доступ по индексу за константное время. Без разницы связный список это или массив - тут я не вижу "доступ по индексу" вообще. Доступо по индексу(*(ptr+N*sizeof(e))) и разименование(*ptr) - эт совершенно разные вещи.


      И да, int пишут либо для мистической "переносимости", либо от тупой привычки. Норм пацаны всегда юзают unsigned там, где не должно что-то опускаться ниже нуля, а неосиляторы орут про переполнение. Дядя страустрп пытался вас приучить к тайпдефам нормальным, но зачем вам это надо? Инт есть всегда, он прост - тыкай везде.


      int - пишет лох(в 99.9% случаев), uint32_t(quint32) - пишет про пацан, который ниодно проблемы с переносимостью не встретит( а дурочки будут дальше ныть про то, как сложен "митический рефакторинг под амд64"). А ещё более про пацаны для временных переменных юзают fast_t размером с регистр и не страдают фигнёй.



      Ну а тайпдефы кути ущербны(имхо) и нужны для переносимости. Но юзайте, юзайте, иначе защитники недокнпеляторов закидают меня какахами.


      Ну а так - говно, показывает Суть ООП. Как вайл-моностроку без тела заменяют на стопицот строк, а потом пишут "ваш Си говно, надо писатьмногострок". Просто смишно. Ну и работает всреднем раз в 10медленней.
      Ответить
      • Ебать тебя бомбануло ))
        Ответить
      • Что ты куришь?:)

        Про доступ по индексу - это было к тому, что раз он считает row/column (это нужно для того, чтобы засунуть в таблицу), то их можно было использовать как а) счетчик б) как средство доступа к текущей строке - уменьшение производительности было бы минимальным. Итераторы нахрен не нужны в данном куске кода.

        Про int. На _всех_ мне известных архитектурах размер инта _строго_ 32бита. И это сделано как раз потому, чтобы не ломать переносимость - ни один разраб компилера, находясь в здравом уме, не будет делать int 64битным.
        Кроме того, ф-ии qt-контейнеров, такие как count(), indexOf() - все возвращают int. Поэтому использовать unsigned неудобно - компилер будет выдавать кучу варнингов про каст от signed к unsigned.
        Писать quint32 тоже абсолютно бессмысленно в данном случае, так как нас абсолютно не волнует размер счетчика (см пункт 1) - даже если int каким-то чудом окажется 64битным, то всё будет спокойно работать (16 битные платформы, вроде, уже умерли).
        Ответить
        • Ок, доступ по иднексу к связному спику - логично.


          И? Будешь тут писать unsigned long int, а там int, а там uint32_t, а там uint64_t? Аргументация на уровне детсада. Я говорил о тайпдефах в целом, а не о инте.


          Ну естественно там инт, ибо оно возвращает -1. А почему инт в count() - это вопрос к коду кути, который говно( чего стоит боязнь указателей в одном куске кода и юзанье их уже 10строками ниже, где без них можно обойтись). Поэтому оно тормазное говно.


          Нет. Писать не unsigned, юзать для временных переменных( включая счетчики) int. Это всё говорит о полном незнании архитектуры на которой пишешь, и языка в частности.



          Хотя конечно, наверное круто везде писать int и на каждом чихе проверять if(n > 0), как это делается в кути.



          Хотя с кути ладно, он писался для полных неосиляторов и если пацан напишет в конструкторе сайз -1, то ничего не будет, а вот если будет uint32_t, то его приятно удивит count(), вернувший UINT32_MAX.



          Пусть робатет, ведь как работает не важно - важно чтобы работало. Логично, ничего не скажешь.
          Ответить
          • facepalm. Я же написал - доступ по индексу за константное время. Какой нафиг связанный список?? QStringList (и QList) - это вектор.

            Расскажите, пожалуйста, в каком именно месте Qt тормозит?:) Желательно, предоставив бенчмарки. Я могу предоставить мини-бенчмарк, сравнивающие std::vector и QVector/QList, сравнение не в пользу std::
            Ответить
            • Этож ПП. Твоя О-натация работать только у тебя в радужных мечтах и снах ООПешника, верующего в "алгоритмы". Мне твоё константное время ниочем не говорит, можно и связного списка идексацию запилить.



              Юзаю кеды, не аргумент? Ладно. Писание гуйни на кути+разгребание тонн говнокода на кутикоре тоже?


              Твои бенчмарки? Зачем ты мерил говно с говном? Ты мерий вектор с malloc(100500*100500). Или ты до сих пор веришь в нужность реалока и выделение памяти?
              Ответить
              • > Ты мерий вектор с malloc(100500*100500)
                Так тонко, что даже толсто... Тогда уж лучше заниматься писькомерством с
                unsigned char buf[100500];
                оно работает еще быстрее, выделяясь за одну ассемблерную команду.
                Ответить
                • Пусть бечмарчит - я поржу. И это не пиписькомерьство - кути реально тормазит как говно - одаело меня оно. Даже стл так не тормазит. Он скажет, что стек не резиновый, а сишкафичи нет в плюсах.
                  Ответить
                  • кути говно? засунь себе хуй в рот.
                    Ответить
                  • Кстати, мне интересно - а что не тормозит?:) Что-то я, кроме ассемблера, ничего не могу придумать:)
                    Ответить
                    • Не тормазит сиасм. Даже Си без ассемблера тормазит. Но не все любят макроассемблеры и ужосы оных, поэтому юзают связку сиасм, как высокоуровневыйЯП(этакий проссплатформенный ассемблер) с хорошим компилятором, минималистичным синтаксисом и приемлемой предсказуемостью, а ещё он не перегружен фичами. И к нему либо инлайнассемблер, либо просто ассемблер.

                      Да и не в этом суть. Суть в том, что универсальность тормазит. Кути не тормазит, стл не тормазит - тормазит их универсальность. Эта новомодная погоня за универсальностью. Она порочна - она не нужна.
                      Ответить
              • Индексацию за О(1) вы для линкед листа никогда не напишите.
                Если вы не умеете применять о-нотацию на практике - ваши проблемы, именно она помогла в свое время оптимизировать айтеммодели-вьюхи в рабочем проекте.

                Кеды не аргумент совершенно, они написаны в совершенно другом стиле, нежели Qt (боже, они d_ptr в каждом классе заново открывают, с чего оно будет быстро работать?)

                Вы пишете гуй на Qt и не знаете, что QList - вектор? Океееей.... "Тонны говнокода на кутикоре" - это НА коре или В коре? Кажется, что говнокод - это личные трудности тех, кто не умеет использовать Qt, нет?

                Окей, какие контейнеры не говно?:) Буст интрузив? Кажется, что сравнивать с ними - это будет теплое с мягким.
                Я мерил вектор как с преаллоком (на 10^9 элементов), так и без (на 10^4 итераций аппенда минимум) Здесь http://mtgs.clan.su/stlvsqt.zip какая-то из версий; эксперименты с другими типами данных и преаллоком можете произвести сами.
                Также было бы прикольно, если бы кто-то написал бенчмарк, сравнивающий хеши/мапы (не уверен, что метод, представленный здесь http://habrahabr.ru/post/170017/ даёт правильные результаты, тк кол-во итераций в Q_BENCHMARK иногда очень сильно разнится, могу предположить, что это происходит из-за сильных разбросов => подсчет кол-во итераций за 1 сек может давать неверный результат)
                Ответить
                • Реально? Прилепи к нему вектор указателей на елемент, который будет обновляется каждую вставку/удалении.

                  О-натация бесполезна чуть более, чем полностью, ибо работает она в твоих мечтах. То, что ты там что-то "оптимизировал" и как - для меня не аргумент. Уж банальности, про O(n) почти всегда быстрее O(1) до определённого n - я тебе писать не буду. А уж про собенности работы с памятью. Да что я тебе рассказываю.

                  Я похож на идиота, которы йбудет юзать кутикор? Уж максимум, что я буду юзать - это стл. Я тебе уже привел пример говна в кути. Да, говна и в кутикор и на кутикоре.

                  Я тебе написал, что не говно( хотя сам малок то ещё говнецо) malloc(100500*100500) - на него ровняйся. Все приплюснутые контейнеры говно, ибо интерфейс ставится во главу угла, ибо мозг 95% не может хранить много сущностей.

                  Твой тест говно - хз чё он мериет. Ну подобавлял ты туда много раз одну и туже строку, и? Возьми для начала мильёнчик уникальных слов.

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

                  А так - это всё детсад и ясли. Абсалютно бесполезно.
                  Ответить
                  • > Вот берёшь какую-то реальную задачу и уже на ней мериешь.
                    Так точно. Бенч на реальном сценарии (или на упрощенном, но приближенном к нему) намного полезней субъективных бенчей хуйпоймичего.

                    > Прилепи к нему вектор указателей на елемент, который будет обновляется каждую вставку/удалении.
                    Тогда зачем тут связный список?
                    Ответить
                    • >Так точно. Бенч на реальном сценарии (или на упрощенном, но приближенном к нему) намного полезней субъективных бенчей хуйпоймичего.
                      Молодец, ты почти наступил на ахилесову пяту ООП. ООП, как мир абстрактного работает только с абстрактным. Когда же дело доходит до реального мире - адепты ООП пытаются съехать с темы и съюлить и свести разговор к "безопасности", "универсальности".

                      Про реальный мир, почему я хаю ООП - патамучто запилить тот же вектор под свои данных, со своим удобным и не избыточным алокатором(либо без него, если ваще хардок) и премлемой шустростью РЕАЛЬНО проще, чем адаптировать универсальный контейнер.

                      Универсальный контейнер нужен для быстрого прототиповаяния, когда нужно быстро сваять какую-то байду на один раз( для чего собственно и были придуманы скриптовые ЯП). Но мы понимаем, что в 99.(9)% случаев прототип никогда не будет переписан. Поэтому весь программо-мир скатился в говно и жив засчёт дешевой рабсилы и железа.
                      Ответить
                  • > ибо мозг 95% не может хранить много сущностей
                    А мозг 5% может хранить чуть-чуть больше сущностей. При этом если этот мозг ослаблен простудой или вчерашней попойкой, или его периодически отвлекают от работы коллеги, то он работает ничуть не лучше чем мозг оставшихся 95%.

                    Вы предлагаете не разбивать задачу на подзадачи? Не использовать уже существующие наработки и тратить время на разработку всего с нуля и самостоятельно? Помилуйте, сейчас процессоры и плашки оперативки намного дешевле оплаты труда хорошего программиста...

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

                      Широкое мышление это на милиметр шире, а на порядки, на сотни порядков шире. Это как длинна причинно-следственных цепочек, когда у 95% - это 2-3звена, а у 5% тысячи.

                      Поэтому 95% и пытаются придумать себе мирок, ограниченный мирок. Этот мирок должен быть ограничен 10-20абстракциями с 1-2смыслами( почему неосиляторы не любят Си, ибо один символ - множество действий.).


                      >Вы предлагаете не разбивать задачу на подзадачи? Не использовать уже существующие наработки и тратить время на разработку всего с нуля и самостоятельно? Помилуйте, сейчас процессоры и плашки оперативки намного дешевле оплаты труда хорошего программиста...
                      Да нет же. Я считаю, что программист - это человек, который вмещает в себе все уровни абстракций начиная с софтварного уровня. Его сознание и код не должен ограниваться парадигмами, языками( но тут тоже спорно, ибо вменяемых ЯП 2-3штуки 2 из которых - это сиасм), теорией, О-нотацией, примитивами, готовыми шаблонами и т.д. т.п.
                      Ответить
                      • > разница между человеком и тараканом
                        Е.Замятин, "Бог"

                        > Поэтому 95% и пытаются придумать себе мирок, ограниченный мирок
                        Если бы. 95% пишут нечитаемую кашу, имеют слабое представление о модульности и построении правильных абстракций. Гениальный код настолько прост, что понятен с первого взгляда, и в нём, очевидно, нет ошибок.
                        В соседнем треде упоминались GNU-style и сорцы Emacs. Так вот, сорцы Emacs (во всяком случае, сишную часть) я считаю хорошо написанными (пролистывал как-то на досуге пару лет назад). Мне не импонирует gnu-style, но код мне показался весьма простым. И, кстати, с абстракциями там всё впорядке. Для меня подобный код является примером для подражания.

                        Из знакомых мне кодобогов только Линус на словах весьма прохладно относится к абстракциям, но это скорее от склонности к троллингу. Вам до него далеко, это точно. Его троллинг - недостижимая вершина мастерства.
                        Ответить
                        • Ну, нечитаемая каша, абсалютно избыточная каша построенная на абсалютно избыточном синтаксисе и абсалютно избыточных абстракциях.

                          Вот код выше - пример того, как пишут люди с ООП-говного мозга. Эту байду из 20строчек(10, если напишет автор) можно заменить strchr+вайл на 1-2строки.

                          Да суть ен абстракциях - суть в том, что про-пацан никогда не ограничен парадигмой. Он пишет в ООП-стеле не потомучто ООП - это модно и недля ООП ради ООП, а только потому, что ООП в данном случае понятней, удобней и просто лучше.


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


                          У меня есть ещё лет 25-30 есть чтобы дорости до великого линуса.
                          Ответить
                          • Если линус такой великий, то почему линукс такой кривой?
                            Ответить
                            • Расскажите нам о кривизне ядра
                              Ответить
                              • 12309
                                Ответить
                              • http://www.linux.org.ru/news/security/8893744
                                Ответить
                                • И в чём говнистость? В том, что есть баги и уязвимости? Они будут в любой системе, кто-бы её не писал. Устраняются они в линуксе, кстати, весьма шустро.
                                  Ответить
                      • > она настолько огромна как разница между человеком и тараканом( в смысле разумности)
                        Странно, раньше такая форма фимоза встречалась мне только среди лисперов.
                        Ты ещё не рассылаешь жывтоне по биореакторам, не?
                        Ответить
                    • >Да, можно все писать с нуля. Да, мне тоже иногда хочется позаниматься байтоебством или для души реализовать какие-то новые алгоритмы самому. Но это совсем не повод не юзать уже проверенные и отлаженные алгоритмы, которые чуть-чуть медленнее чем собственное решение, на написание (и тестирование с отладкой, а потом и поддержку) которого уйдет драгоценное время...
                      О5 непонимание. Это возможность дана тому, кто может объективно оценить код - т.е. тому, кто это сам может реализовать. Но её требуют люди, которые САМИ сложнее хелворда НИЧЕГО НАПИСАТЬ НЕ МОГУТ - они полностью не компитентны во всём, начиная от архитектуры, заканчивая уровнем ОС и прокладухи.

                      Их мнением движет вендор и маркетолог и желание поменьше делать, а результата иметь побольше. Они пытаются юзать твои аргументы, аля "зачем мне байты - всё уже написано, я ИЛИТА, преждевременная оптимизация, оптимизация для лохом, идите сами трахайтесь со своими битами". Но мы понимаем, что за твоими слова стоит ВОЗМОЖНОСТЬ и УМЕНИЕ реализовать ЭТО САМОМУ, а за их ТОЛЬКО не желание учиться.
                      Ответить
                      • Сказочный долбоеб, закройся дома и не выходи.
                        Ответить
                        • Вылез тот, кто узнал себя в моих словах - я рад. Вот вам типичный представитель.
                          Ответить
                          • Даже не читал. Слишком много переносов.
                            Ответить
            • >>Я могу предоставить мини-бенчмарк
              Предоставь.
              >>сравнение не в пользу std::
              У вектора из STL есть такие штуки, как growth factor и аллокатор, изменяя которые, можно варьировать его производительность за счет потребления памяти.
              Ответить
              • Дело не в аллоках, а таких оптимизациях, как использование меммува для COW-based типов в Qt. В общем, стд:: для простых типов даже лучше, чем Qt контейнеры, но ситуация резко меняется, если использовать COW.
                Ответить
                • > ситуация резко меняется, если использовать COW
                  Потокобезопасный COW (а в кутишке он потокобезопасный) тоже далеко не бесплатен...

                  На самом деле, глупо говорить "std::vector быстрее, чем QList" или "QList быстрее, нежели std::vector". Производительность - не одномерная величина. Можно говорить только "при таком-то сценарии использования XXX окажется выгоднее чем YYY". И поэтому бенчмарки, заточенные под один сценарий, совершенно бесполезны, если контейнеры будут использоваться по-другому.
                  Ответить
                  • В остальных сценариях, как я уже написал, std:: чуть-чуть быстрее (но порядок тот же - 10 мс против 12 (цифры с потолка*)). Зато на ряде других случаев (как-то вставка cow-based типа в середину вектора), разница на 1 порядок (100мс против 10 - цифры о5 же с потолка*) в пользу Qt контейнеров.
                    Да, COW не бесплатен, зато имеет ряд плюсов (как-то возможность оптимизировать скорость QVector/QList под них), которые компенсируют его медленную скорость.
                    *С потолка == мне лень выписывать нули перед значащими разрядами.

                    Насчет сценариев - можно протестить _все_ варианты использования контейнеров (я протестил те, к-ми часто пользуюсь - аппенд, препенд, вставку) и судить по ним. Очевидно, что любая задача может быть декомпозирована на ряд операций и если ВСЕ операции контейнера А лучше, чем опреации контейнера B, то вполне можно судить, что лучше.
                    Ответить
                    • > вставка cow-based типа в середину вектора
                      Дык тут не скорость вставки в вектор сравнивается, а скорость конструктора копирования у стринга. Естественно COW строка копируется быстрее, чем std::string, который копируется полностью. А если сравнивать std::vector<QString> и QVector<QString>, имхо, разница будет в пределах погрешности, и не в пользу QVector.
                      Ответить
                      • В случае QVector'а и вставки копирующий конструктор QString'а вообще не вызывается.
                        Да, и std::string тоже использует COW
                        Ответить
                        • >>Да, и std::string тоже использует COW
                          Не факт. Реализаций STL немало, где-то могут использовать, а где-то - нет.
                          Ответить
                          • Согласен. Поправлюсь - бегло смотрел std::basic_string (или как там ее) в gcc 4.6, маковском шланге 4.1 и мсвц2010 - в этих есть refcount.
                            В других реализациях может не быть, тут вы правы.
                            Ответить
                            • Надо было эту ссылку вставить в предыдущее сообщение.
                              http://goo.gl/IFoLO
                              Ответить
                              • Вот за это я и не люблю std:: :)
                                Спасибо, статья интересная. Не сказать бы, что что-то новое узнал, но структурирование информации всегда полезно.
                                Кстати, вариант D как-то совсем плох в случае юникод строк, врядли он где-то сейчас используется?
                                Ответить
                        • А, и правда, я ступил, QTypeInfo<QString>::isStatic это false, поэтому при insert'ах вектор нагло и быстро таскает его memmove'ом, не вызывая конструкторов\деструкторов.
                          Ответить
                • Моя твоя не понимать. Как copy-on-write относится к QVector и std::vector? Эта техника реализована в QVector? Тогда это плохой вектор, потому что он должен быть простым динамическим массивом с константным временем доступа к элементу безо всяких проверок "ой, меня поменяли, скопироваться надо". Или copy-on-write должна применяться к типу элементов вектора, чтобы вставки-удаления были быстрее? Тогда от вектора ничего не зависит - свою часть работы он выполняет, просто его неправильно применяют.
                  Ответить
                  • К типу элементов, да.
                    Что значит "неправильно" применяют? vector<QString> всяко удобнее и безопаснее, чем vector<QString*>, но без COW первое будет сильно медленее в ряде случаев => оно неправильное?
                    Ответить
                    • Ладно, уговорил. Я просто привык к тому, как работает вектор STL и в такой ситуации воспользовался бы std::vector<std::shared_ptr<std::string> >.
                      Ответить
                  • Сам вектор тоже COW. И все его неконстантные операции (да-да, АВВАРОН, включая неконстантные скобочки) вызывают расщепление.
                    inline const T &QVector<T>::operator[](int i) const { 
                        Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
                        return p->array[i];
                    }
                    template <typename T>
                    inline T &QVector<T>::operator[](int i) {
                        Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range");
                        return data()[i];
                    }
                    ...
                    inline T *data() {
                        detach();
                        return p->array;
                    }
                    Ответить
                    • Да, я в курсе. Зато at() расщепления не вызывает (ибо есть только const версия); я его всё время и использую.
                      Ответить
                      • > Зато at() расщепления не вызывает
                        Я в курсе. Но на сценариях, в которых надо бегать по вектору и править его элементы, COW сказывается не самым лучшим образом - хотя настоящее расщепление произойдет максимум один раз, проверка будет выполняться на каждой итерации. Можно, конечно, вызвать data() и работать с массивом...

                        P.S. Забавный коммент в исходниках QVector:
                        // ### Qt 5: Consider making QVector non-shared to get at least one
                        // "really fast" container. See tests/benchmarks/corelib tools/qvector/
                        Ответить
                        • Забавно, потому что в 5ке этот коммент тупо убрали:)
                          На самом деле, там переписали QVector/QString/QByteArray поверх одного класса - QArrayData
                          Ответить
              • как менять growth factor в векторе? по стандарту нельзя
                Ответить
        • > int строго 32 бита
          16 битные рахитектуры?
          > quint32 бессмысленно
          контейнеры больше чем на 2 гига?
          нет, не слышал

          выдать count() и size() в signed int - это пиздос, даже не верится, что в qt настолько все плохо
          Ответить
          • > контейнеры больше чем на 2 гига?
            Ну во-первых на реальных 32-битных системах больше чем 2 гига все равно не дают (да, в некоторых извращенных конфигурациях можно добыть 3 и даже 4, но это именно извращенные конфигурации, не самым лучшим образом влияющие на работу ядра). Во-вторых на 64-битной системе этот quint32 стал бы новым искуственным ограничением на 4 гига минус 1 байт. Поэтому только size_t/ptrdiff_t, только хардкор.
            Ответить
            • поэтому стльные контейнеры объявляют в себе size_type, вместо того, чтобы возвращать int или quint32 или еще какое недоразумение
              Ответить
            • Кстати, а где у QVector и прочих контейнеров аллокаторы?
              Ответить
              • Удар прямо в сердце ;)

                Ну что тут ответить. Отвечу только то, что Qt это не STL, который должен охватить все-все-все сферы применения, и поэтому просто обязан иметь возможности для тюнинга. А для большинства GUI приложений кутишных контейнеров вполне достаточно.
                Ответить
                • stl контейнеры не имеют возможности заменить аллокаторы на пулы. А вот это уже удар прямо в яйца ;)
                  Ответить
              • Кстати, кажется, что стлные аллокаторы и size_t - это всего лишь странная попытка абстрагироваться от отсутствия модели памяти в c++; Qt же пошло другим путем - поглядело, что модели памяти, в общем-то, мало отличаются; и забило на эту абстракцию.
                Ответить
                • тем не менее, если int это всегда 32 бита, как ты утверждаешь, как в кутэ на 64 разрядной ОС поиметь 3 гиговый контейнер?
                  пока что это всё выглядит так, что праотцы накосячили в интерфейсе (потому что в лихие 90-е они развлекались как могли, и 2 гига "хватит всем"), и более того, сделали очевидное беззнаковое знаковым, потому что "ну компилятор то ругается, когда я как дебил переменную цикла объявляю int, это определённо недостаток контейнера"
                  а теперь это называется "другой путь", ну-ну

                  аллокаторы это не странная попытка абстрагироваться, это совсем другое
                  но они работают как нужно только начиная с 11 стандарта (это к комменту про пулы)
                  Ответить
                  • Не путайте размер контейнера и кол-во элементов. Вы можете разместить 2^31 элементов в контейнере - это значит, что на 32битной системе на данные у вас останется еще столько же места, сколько сожрал сам контейнер. Вектор чаров такого размера (а больше ничего не влезет) очень полезен, да..
                    На 64битной системе всё лучше, на данные приходится гораздо больше места, мы можем использовать не только чары:)
                    Вот только засовывать массив такого объема в память - всяко хреновая идея...
                    Насчет праотцов - в Qt это могли поменять уже 4 раза (во 2й..5й версии). Очевидно, раз это не сделано (а в 5ке QMap/QVector/QString/QByteArray полностью переписаны), то врядли дело в обратной совместимости. Просто это не нужно никому. В память не влезут такие контейнеры.
                    Ответить
                  • > Не путайте размер контейнера и кол-во элементов.
                    Там в QVector используется malloc с интовым параметром, поэтому ограничение не в два гигаэлемента, а именно в 2 гига памяти. В QList, если я не туплю, удастся запихать до 512М элементов, даже очень больших.

                    > поиметь 3 гиговый контейнер
                    А вот эта проблема, имхо, надуманная. В 99% случаев такие гигаконтейнеры не нужны. А в тех случаях когда программе реально нужен такой объем данных (более 500 миллионов элементов в одном контейнере) - всяко нужно что-то более узкоспециализированное, заточенное под конкретную задачу, а не QVector и не QList и даже не std::vector.
                    Ответить
                    • P.S. Все-таки Qt это не то средство, чтобы писать с его помощью гугловские map-reduce, движки СУБД, хранить многогигабайтные кеши, или писать числодробилки, оперирующие миллиардами элементов в памяти...

                      Qt - прежде всего платформа для разработки GUI приложений, а для 99.99% таких приложений 3 гиговый контейнер, действительно, не нужен.
                      Ответить
                      • я предвидел эти ответы
                        слишком предсказуемо
                        "если это не сделано в кутэ, значит это не нужно никому"

                        вместо того, чтобы признать, что знаковый результат для категории "количество" - абсолютно притянутое за уши ограничение, которое безболезненно исправляется, и другой причины, как "я пeшу цикл for (int i = из учебника, а компилятар ругаеться!" этому нет
                        Ответить
                        • > "если это не сделано в кутэ, значит это не нужно никому"
                          Правильнее будет так: "если это не исправлено в кутэ, значит тролли не хотят без особо веской причины ломать совместимость с существующим софтом" ;)

                          > абсолютно притянутое за уши ограничение, которое безболезненно исправляется
                          Не совсем за уши. Если мы исправляем size(), то нужно исправить и indexOf() и аналогичные ему, т.к. кому нужен контейнер, в котором можно найти не все элементы? Придется возвращать какой-нибудь not_found = ~0 или вообще выпилить indexOf() и юзать только итераторы. Оба решения не очень хорошо скажутся на существующем коде переломав его к хуям.
                          Ответить
                          • все остальные сравнивают с std::string::npos, если им надо
                            что мешает сделать QVector::QNPos? видимо, они передрались из-за того, сколько букв q и в каком регистре придется засовывать, и остановились на -1

                            про совместимость - выше же было отмечено, что в мажорных версиях все и так переписано
                            Ответить
                            • Ну вот то и мешает, что когда-то, в стародавние времена, вместо константы сделали -1, а теперь тонны кода юзают == -1 и < 0 (т.к. что им остается?), и поломаются при смене типа с инта на ансайнед.
                              Ответить
                              • Вот что делает отсутствие в стандартной библиотеке в крестах MayBe или boost::optional.

                                Вон в гугле запрещены исключения по документам и все счастливы использовать аналог MayBe-типа.
                                Ответить
                            • > в мажорных версиях все и так переписано
                              Реализации поправили, а интерфейсы то не изменили. Значит или его величество похуизм, или действительно боятся поломать совместимость.

                              Ну не брать же им пример с питона 3. Там все переписали стремясь к идеалу, и где теперь этот питон 3? Сколько лет прошло, а в большинстве линуксов по дефолту стоит второй...
                              Ответить
                        • О5 не путайте теплое с мягким.
                          "Это никому не нужно", значит "это не нужно тем, на кого ориентирована Qt". А ориентирована она, хоть и не только на гуи приложения, но не стремится покрыть все возможные юзкейзы.
                          Если встает вопрос о том-нужен ли контейнер, в к-и можно разместить 2^64 элементов, то int в методе size() - это последнее, о чём стоит волноваться. Для начала стоит выкинуть refcount (ибо копировать ТАКИЕ контейнеры самоубийственно), во вторых, подумать в сторону интрузив, в третьих-выкинуть редблек три в мапе и переписать ее на b-tree.
                          Если же вас волнует не размер, а знаковость/беззнаковость, то не могу понять, чем. Писать != -1 гораздо удобнее и понятнее, чем никому не понятный std::string::npos. Код должен быть простым, а введение npos и size_t его лишь усложняет, но не дает ничего взамен. Нет, ну серьезно, зачем вам вообще нужен unsigned?) потешать самолюбие "я всегда пишу unsigned и const и мой код всегда работает верно"?)
                          Ответить
                          • > const
                            Вы еще не используете const? Тогда мы идем к вам.
                            Ответить
                            • Я использую конст там, где это имеет смысл-например при передаче конст ссылки или в конст функциях.
                              Объявлять же локальные переменные как конст считаю излишним, мой вброс был именно про это - конст локалки, конст инт как возвращаемое значение ф-ии и тп.
                              Ответить
                          • >Писать != -1 гораздо удобнее и понятнее
                            авотхуй. -1 лишено семантики
                            Ответить
                            • if (!pointer) {}
                              0 тоже лишен семантики, ну и что?
                              Ответить
                              • я пишу if (pointer != nullptr)
                                Однако в большинстве случаев я юзаю смарт поинтеры а там как правило есть приведение в bool.
                                А вот сравнение разных типов меня бесит
                                Ответить
                          • b-tree хуже балансируется, чем rb-tree (на некоторых задачах первое даст прирост, но на среднестатистической рандомной задаче rb будет в среднем лучше)
                            Ответить
                            • Зато b-tree жрет меньше памяти.
                              Ответить
                              • И по идее лучше дружит с кешем, TLB и свопом, т.к. читает небольшое количество аккуратных страничек, которые можно выровнять на размер cache line, а не прыгает как двоичные деревья хаотично по всей куче. К тому же оно явно меньше дрочит аллокатор.
                                Ответить
                          • >Для начала стоит выкинуть refcount (ибо копировать ТАКИЕ контейнеры самоубийственно

                            А что плохого?
                            Ответить
                            • > А что плохого?
                              Ну COW для таких структур (а мы рассматриваем контейнеры на 3 гига и больше) совершенно бесполезно т.к. никто в здравом уме не допустит detach'а, копирующего 3 гига. Поэтому проверки счетчика в не const методах будут зазря жрать такты.
                              Ответить
                    • Когда вдруг понадобился контейнер на 3 гига, то бери бд и будет работать даже на машинах с малым объемом памяти. Темболее есть STL подобные бд, если верить Роману
                      Ответить
                  • >но они работают как нужно только начиная с 11 стандарта (это к комменту про пулы)

                    Стали стейтфул? А каким образом это поможет прикрутить пулы?
                    Ответить
          • > контейнеры больше чем на 2 гига?
            > нет, не слышал
            Да, не слышал.
            Ответить
      • За такое количество переносов ногами пиздить мало
        Ответить
    • Разбор csv?
      123;"Hello;World"
      Ответить

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