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

    0

    1. 1
    2. 2
    3. 3
    char* szOwnedData = reinterpret_cast <char*> (m_bOwner && szData != NULL ?
                                                                  realloc (szData, nLength + 1) :
                                                                  malloc (nLength + 1));

    Ha ha, classic.

    Запостил: codemonkey, 13 Апреля 2020

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

    • Переведи на "PHP", Я в низкоуровневом говне не разбираюсь
      Ответить
    • Хотел было спросить где тут, но потом вспомнил, что в сях reinterpret_cast нема.
      Ответить
    • Питушня какая-то. Я так и не понял, в чём говнокод. Может, не хватает контекста?

      1. szData и szOwnedData - две разных переменных, после неудачного realloc szData никуда не утечёт.
      2. из условия можно убрать szData != NULL и покормить realloc нулями, но всё равно из-за m_bOwner тернарник никуда не уйдёт.
      3. питушки кукарекают из-за malloc/realloc/free? А какие альтернативы? И какие проблемы, если эта питушня инкапсулирована в классе?
      4. или дело в nLength + 1? Ну то есть szData был nLength, а тут к нему прихерачивают ещё один байт вместо православного увеличения в два раза? Но для того, чтобы это подтвердить, не хватает контекста.

      Вывод: данный кусок - не говно.
      Ответить
      • Питушки кукарекуют из-за того, что смешан C и С++.

        P.S. Какой оналог realloc в плюсах?
        Ответить
        • А, NULL написали вместо nullptr. Грешновато.
          Ответить
        • хороший вопрос. Семантически подойдет кококококпирующий конструктор, но по перформансу будет проеб.

          Типа:

          Petuh petuh = new Petuh;
          ZhirnyPetuh petuh2 = new ZhirnyPetuh(petuh)

          //дисклеймер: я не крестоблядь
          Ответить
          • При чем тут жирный питух? Обычный массив увеличить.
            Ответить
            • Жирный петух это увеличенный обычный питух

              >массив

              а разве не нужно взять list, и list::resize() ?
              Или я пижжу?
              Ответить
              • int* pituh = new int[10];

                Нужно увеличить питуха в 2 раза.
                Ответить
                • но почему массив? почему не list?
                  Ответить
                  • Во-первых не list, а vector. Во-вторых - захотелось. Вдруг этот укококозатель куда-то в библиотечную функцию передавать?
                    Ответить
                    • я на жабоёбском, извините

                      ну у него же есть ресайз?
                      Ответить
                    • > Вдруг этот укококозатель куда-то в библиотечную функцию передавать?
                      Именно для этого придумали «std::vector::data()».
                      Ответить
                      • Ну может ему насовсем передать надо, а не просто посмотреть. И сишная функция потом free() позовёт.
                        Ответить
                        • Именно поэтому я против «сишных функций».
                          Ответить
                        • >И сишная функция потом free() позовёт.
                          Не ты аллоцировал — не тебе освобождать.
                          Ответить
                          • Подтверждаю.
                            Ответить
                          • Да, это самый простой способ не запутаться в собственных соплях. Иначе будут постоянно двойные освобождения и висящие указатели
                            Ответить
                            • Для анскильных питухов
                              Ответить
                              • Да не только

                                Если есть malloc, значит на том же уровне абстракции должен быть фри.


                                Если есть add, должен быть remove.
                                Если есть шаг -- должен быть след
                                Если есть тьма -- должен быть свет
                                Ответить
                                • Если ты запутался в собственных абстракциях, то ты анскильный питух. Более того, абстракции не нужны.
                                  Ответить
                                  • Все верно для случая, когда ты в одно лицо пишешь hello world.

                                    А когда

                                    Четыре тысячи петухов
                                    И четыре тысячи индюков

                                    пишут, например, Лиснук, им трудно не создавать абстракций, а не запутываться в них еще сложнее
                                    Ответить
                                • Каждому яблоку — место упасть,
                                  Каждому вору — возможность украсть,
                                  Каждой собаке — палку и кость,
                                  И каждому волку — зубы и злость.

                                  #песни
                                  Ответить
                              • Лукавый питух и ленивый!

                                Ты освобождал, где не аллочил, и собирал, где не рассыпал; посему надлежало тебе отдать память мою немедля.

                                И я, придя, получил бы моё.

                                Ибо всякому освобождающему дастся и приумножится, а у занимающего отнимется и то, что имеет.

                                А негодному отбросу дайте скриптуху: там будет плач и скрежет зубов.
                                Ответить
                                • Скрываю вореции.
                                  Ответить
                                  • Когда же приидет Царь во славе своей и все святые бояре с Ним, тогда сядет на престоле славы своей.

                                    И соберутся пред Ним все кодеры; и отделит одних от других, как пастырь отделяет бояр от скриптухов; и поставит бояр по правую сторону, а биомусор — по левую.

                                    Тогда скажет и тем, которые по левую сторону: идите от Меня, проклятые, в огонь вечный, уготованный скриптухою

                                    Ибо Я был на хабре, и заминусовали Меня; был на ЛОРе, и забанили Меня; был на ГК и смеялись надо Мной; был в блоге, и не посетили Меня.

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

                                    Тогда скажет Царь тем, которые по правую сторону Его: придите, благословенные, наследуйте Царство, уготованное вам от создания Сишки.

                                    И Царь скажет им в ответ: истинно говорю вам: так как вы сделали это одному из сих бояр Моих меньших, то сделали Мне.
                                    Ответить
                                    • Церковная тема - это и так вореции. Ты и с этим умудрился скобенировать. Какой скилл )))
                                      Ответить
        • Я бы использовал сишный realloc + placement new, если это массив какой-то сложной питушни.
          Ответить
        • Да. А ещё проверку на NULL и malloc можно было убрать.

          Например у вектора resize.
          Ответить
          • Вы заебали. Я не про вектор спрашиваю, а как чистый укозатель ресайзнуть!
            Ответить
            • > как чистый укозатель ресайзнуть
              Перейти на другую архитектуру, где указатели шире/уже.
              Ответить
            • В крестах чистые указатели вроде как не приветствуются. Используй готовые контейнеры.

              Да и sizeof(укоззатель) же в конпайл тайме же работает же, как ты ево ресайзнуть собираешься? Регистры программно расширять чтоли умеешь?
              Ответить
              • Ты рофлишь что-ли?
                есть
                pituh1 = (int*)malloc(100500*sizeof(int))
                есть
                pituh2 = new int[100500]
                есть
                realloc(pituh1, 2001000*sizeof(int))
                как c pituh2 сделать?

                Вопрос понятен?
                Ответить
                • Зачем он есть? Зачем? Зачем?

                  Почему он не может быть вектором, массивом, строкой и тюпю?
                  Ответить
                  • А зачем есть new int[]?
                    Ответить
                    • для бобратной совместимости

                      зачем есть char* и string?
                      Ответить
                    • Забудь эту хуйню как страшный сон. Юзай std::array или std::vector.

                      Помнится, в делфи и сибилдере можно было ресайзить массив. И что в итоге? Макаки умудрились нахуевертить Алгоритм Шлемиэля почти в каждой проге. С вектором это сделать сложнее, он не реаллочится на каждый чих.
                      Ответить
                      • Именно поэтому я за «динамические массивы».
                        Ответить
                        • Именно поэтому я за подмножество поцкаля, которое преподают в школе.

                          Мы там про демонические массивы ничего не знали, у нас всё сатаничесоке былдо.

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

                          Если делаешь new int[] или malloc, выделяется непрерывный кусок памяти. Если нет свободного места, чтобы его реаллочить на месте, приходится выделять новый кусок памяти, копировать туда все элементы, потом удалять старый кусок.

                          std::vector не обязан размещаться в непрерывном куске памяти. Доступ к его элементам не по сишному указателю с арифметикой, а через перегруженный оператор []. Чтобы реаллочить std::vector, не нужно выполнять пердолинг из предыдущего абзаца, достаточно выделить в произвольном месте памяти блок для новых элементов. Перегруженный оператор [] автоматически направит тебя на старый или на новый блок.

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

                                  А у new int[] вся выделенная память задействована, поэтому для добавления даже одного элемента нужно делать полный реаллок.
                                  Ответить
                          • > не обязан размещаться в непрерывном куске памяти

                            Лол што? Он тоже создаст новый кусок, и удалит старый. Но я думаю он позовёт realloc или его аналог.
                            Ответить
                            • Он не может позвать realloc если тип нетривиален. Для нетривиальных типов он обязан выделить новый буфер, переместить (или скопировать) туда элементы и удалить старый буфер. От realloc'а такие типы может распидорасить.
                              Ответить
                              • https://github.com/microsoft/STL/blob/master/stl/inc/vector#L1182
                                Ответить
                                • Даже читать не буду. Ты там, видимо, перегрузку для тривиально-копируемых типов мне хочешь показать?
                                  Ответить
                                • То есть в пике потребление памяти будет OldCapcity + NewCapacity, даже если можно расширить текущий кусок памяти. Крестобляди соснуле.
                                  Ответить
                                  • Какой багор )))
                                    Ответить
                                  • Я теперь понял, для чего в «Линуксе» придумали оверкоммит.
                                    Ответить
                                  • > расширить текущий кусок памяти

                                    А это очень редко работает, на самом деле. Особенно в многопоточной проге.

                                    Ну и у вектора есть reserve() если ты примерно знаешь сколько в нём будет элементов и хочешь чтобы он лишний раз не реаллочился.
                                    Ответить
                                    • а если пойти обратным путем - не расширить, а скажем, сузить? М?
                                      Ответить
                                  • >То есть в пике потребление памяти будет OldCapcity + NewCapacity
                                    >даже если можно расширить текущий кусок памяти

                                    В других языках типа Йажи, те же проблембы. Разве что gc память дефрагментирует. Но всё равно перепитушня.

                                    > я думаю он позовёт realloc или его аналог.

                                    Вот в С++42 допилят move-семантику моей мечты для нетривиальных конструкторов. И она будет делать realloc, схлопывать new+delete, превращать воду в вино и творить прочие чудеса.
                                    Ответить
                              • Кстати, после перемещения все старые укокококозатели на элементы станут недействительными... Если элементы указывают друг на друга, то указатели может пропатчить функция копирования/перемещения, а с внешними указателями будет какой багор.
                                Ответить
                                • Ну да, итераторы становятся невалидными после push_back() и его друзей.
                                  Ответить
                                  • даже в жапе нельзя менять объект, по которому ты итерируешься (кроме как через итератор), иначе лапатнешь КонкаррентМудификейшен
                                    Ответить
                              • А как-нибудь можно расширить блок, е сли за ним свободоместо имеется? Или с нетривиальными типами он всегде купировать будет?
                                Ответить
                              • Можно двухэтапный realloc
                                1. выделить новый кусок
                                2. если новый кусок выделен (не NULL) и не равен старому (расширение), удалить старый

                                Тогда между этими этапами в случае, если новый кусок выделен и не равен старому, можно использовать placement питушню. И всё как надо будет.
                                Ответить
                        • > реаллочит свои кишки

                          Вектор всё равно не смог бы юзать такой массив в качестве бекенда. Ему ещё capacity надо, а не только size. Так что это просто бесполезный атавизм от первых версий крестов.
                          Ответить
                        • > на говнофорумах

                          Ну а что ещё сказать, если это ненужный атавизм от первых версий крестов, у которых ещё вектора не было?
                          Ответить
                          • Повтори ещё раз пожалуйста, он же не запомнит.
                            Ответить
                            • Да я думал та правка не отправилась.
                              Ответить
                              • А я вообще не думаю, я просто отвечаю "уёбкам" и теку.
                                Ответить
                        • У него там другой виктор, попримитивнее.

                          ЗЫ. Ты мудак, зачем тебе это нужно. Зачем? Зачем?
                          Ответить
                      • >Шлемиэля
                        Шлемазла
                        Ответить
                      • Макаки создавали массив размером 1, и пхали туда в цыкле тыщу элементов?

                        умнички какие.

                        У жабоебов тоже есть лист, и он тоже аллокейтится с запасом именно от таких вот долбоёбов
                        Ответить
                        • Ну да, я даже сам так делал пока не заметил как это лагает.
                          Ответить
                          • а добавлял новые элементы ты в начало массива, я надеюсь?
                            Ответить
      • Явное выделение памяти в коде на «C++» в 95% случаях — говно.
        Ответить

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