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

    −5

    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
    class SNMPRemoteAgentSet
    {
    protected :
    	std::vector<SNMPRemoteAgent*> _agents;
    }
    
    void SNMPRemoteAgentSet::clear() {
    	while((int)_agents.size()) {
    		delete _agents[0];
    		_agents.erase(_agents.begin());
    	}
    }
    
    SNMPRemoteAgentSet::~SNMPRemoteAgentSet() {
    	clear();
    }

    Вот такой код нашёл в проекте. Таких говно-деструкторов в этом проекте ещё полно.

    Запостил: SuperCellSky, 01 Октября 2018

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

    • Кто уделит пару минут?
      Ответить
    • Сложный юмор
      Ответить
      • я тоже чет не вникаю, рабочий метод ведь.
        ну правда думаю что все-таки лучше просто итератором от начала до конца пройтись удаляю каждый элемент
        Ответить
        • std::vector::erase
          
          Complexity
          Linear: the number of calls to the destructor of T is the same as the number of
          elements erased, the assignment operator of T is called the number of times
          equal to the number of elements in the vector after the erased elements
          Ответить
          • а, ок, спс. теперь понятно
            Ответить
          • Но там вектор "raw" указателей. Никаких деструктров вызываться не будет. Разве что memove
            Ответить
            • Там вызовется (size() - 1) assignment operator of T — то есть весь вектор будет поэлементно сдвинут влево.
              Ответить
              • Да, любой вменяемый компилятор догадается вставить memmove:
                https://godbolt.org/z/RFa0wg

                Хотя формально -- да: кучу раз assignment
                Ответить
                • Дык один хер получится O(n^2), даже с memmove.
                  Ответить
                • Но memmove — это не O(1), а те же самые O(n), что и у кучи assignment — в результате всё это удаление становится O(n^2).
                  При 1000 элементов получается вот такая прелесть:
                  http://quick-bench.com/R72b9076b0i9QncZzORh9Y25LU0
                  А при 10000 разница — три порядка.
                  Ответить
                  • > Но memmove — это не O(1), а те же самые O(n), что и у кучи assignment — в результате всё это удаление становится O(n^2).
                    Не смотря на одинаковое O(n) memmove будет быстрее чем куча assignment (при условии что компилятор не заменит assignment на memmove)
                    Ответить
    • расскажите человеку о std::unique_ptr<T, Deleter>.
      std::vector<std::unique_ptr<SNMPRemoteAgent>> _agents;
      Делает всё тоже самое, только на за O(n^2).
      Ответить
      • А почему O(n^2) а не просто O(n)?
        Ответить
        • Потому что удаление каждого элемента двигает все остальные.
          Ответить
          • ПЧМ Б Н ДЛТ С КНЦ?
            Ответить
          • А ну, я думал предлагается еще и избавится от деструктора, ибо и так будет норм. А если писать как в топике -- то да, один фиг.

            > расскажите человеку о std::unique_ptr<T, Deleter>.
            > Делает всё тоже самое, только на за O(n^2)
            Я скорее запутался тут, предполагая, что деструктор std::vector<std::unique_ptr> делает O(n^2) питушню
            Ответить
    • > (int)
      Мало было граблей, хотелось ещё чего-нибудь для 64-битной платформы добавить?
      Ответить
      • Граблей полно, но именно эта куча заставила меня заорать на весь офис )
        Ответить
        • Точно не хуец твоего начальника в твоей жопе?
          Ответить
      • Ты про то, что
        sizeof(size_t) != sizeof(int) на 64bit?
        Ответить
        • Ну да. И 0x100000000 элементов засчитаются за 0.
          Ответить
          • Такие размерности найти - постараться надо
            Ответить
            • Ага. Но это не оправдывает раскладывание граблей на ровном месте.
              Ответить
              • А вообще разве где-то скзазано что size_t это int?
                Мне казалось что еще с C99 это не обязано быть так
                Ответить
                • Оно беззнаковое. Так что оно ну никак не может быть int.
                  Ответить
                • size_t - это unsigned
                  Ответить
                  • тем более

                    почему он вообще решил что int?
                    Ответить
                    • 4 года программирую на "PHP", и даже не знаю как называется тип числа. Поэтому я за "PHP".
                      Ответить
                      • Говнокодик, оказывается PHP абсолютно безвреден!
                        Пишу на нём уже четыре месяца и ваще реально все палучается бобосы текут телки дают а ты начем пишеш?
                        Ответить

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