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

    +15

    1. 1
    2. 2
    3. 3
    String testName;
    //...
    std::swap(testName,  _testName);

    String из thirdparty-библиотеки, а swap везде в нашем коде. По очевидным причинам получаем подение производительности.

    Запостил: LispGovno, 16 Марта 2013

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

    • *падение
      Ответить
      • > получаем пaдение производительности

        каждый раз я вижу как народ в С/С++ извращается с ручной оптимизацией строковых операций, я всегда вспоминаю жабу и ее stringbuilder и бенчмарки согласно которым все чики-пыки.
        Ответить
        • Так стрингбулдер в с++ есть в стандартной библиотеке и если нужно, то всегда можно воспользоваться.
          Ответить
          • То что я пытался выразить: куча проблем в С программах, например в строковых операциях, заключается в том что народ пытается оптимизировать чуть ли не копирование каждого символа. В жабе, ты просто в лоб копируешь все подряд в новый буффер. И оно все равно работает достаточно быстро.
            Ответить
            • > в жабе
              > работает достаточно быстро
              1/0
              Ответить
              • как там в 90-ых?
                Ответить
                • Хуёво, игрушки не покупают, потому что денег нет, президент долбоёб, и постоянное ощущение, что живёшь в стране-параше, вот и все 90е.
                  Ответить
            • в яве потому что динамическая аллокация это просто сдвиг пойнтера
              ну конечно же
              Ответить
              • > в яве потому что динамическая аллокация это просто сдвиг пойнтера

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

                  P.S. Кстати, если серьезно, то если объектов выживает мало - это и есть немного копирований и задвиг поинтера назад.
                  Ответить
    • Нужно специализировать std::swap для String
      Ответить
      • swap специализирован в трид парте библиотеке как и положенно в неймcпейсе, где объявлена String.
        Ответить
        • вместо того, чтобы не вносить сумятицу через adl или специализацию в namespace std, лучше бы в данном месте воспользовались старым добрым testName.swap(_testName);
          Ответить
          • Если оно, конечно, в этой 3rdparty библиотеке есть ;)
            Ответить
          • Have boost type trait for check fully defined type?
            Ответить
            • > check fully defined type
              I think it's impossible.
              Ответить
              • No! boost::checked_delete can do that self, but I want trait for universality!
                Ответить
                • > boost::checked_delete can do that
                  Boost manual says: The supplied function and class templates can be used to prevent these problems, as they require a complete type, and cause a compilation error otherwise.
                  So, it's just compile-time assertion check and nothing more. You can't write a trait for incomplete type detection.
                  Ответить
                  • #include <iostream>
                    #include <boost/mpl/bool.hpp>
                    #include <boost/type_traits/is_pod.hpp>
                    #include <boost/utility/enable_if.hpp>
                    
                    using namespace std;
                    
                    namespace boost
                    {
                       namespace detail
                       {
                          typedef char False;
                          struct True{False dummy[2];};
                          
                          template<class T> 
                          struct helper
                          {
                             static T& makeT();
                             
                             //static True is_complete(T&, bool dummy=(sizeof(T)!=0)/*boost::is_pod<T>::value*/);
                             static typename boost::enable_if<boost::is_pod<T>, True>::type is_complete(T&);
                             
                             static False is_complete(...);
                          };
                       }
                    }
                    
                    namespace boost
                    {
                       template<class T>
                       struct is_fully_complete_type: boost::mpl::bool_<sizeof(boost::detail::True)==sizeof(boost::detail::helper<T>::is_complete(boost::detail::helper<T>::makeT()))>{};
                    }
                    
                    struct Ko_Ko;
                    struct Ok_Ok{};
                    struct Ga_Ga{virtual ~Ga_Ga(){};};
                    
                    int main() {
                       //cout<<boost::is_fully_complete_type<Ko_Ko>::value<<endl;
                       
                       //cout<<boost::is_fully_complete_type<Ok_Ok>::value<<endl;
                       cout<<boost::is_fully_complete_type<Ga_Ga>::value<<endl;
                       return 0;
                    }

                    http://liveworkspace.org/code/2dkPlT$46
                    С какого перепугу SFINAE перестал в gcc работать или он и не работал никогда?
                    Ответить
                    • А вот тут с чего в gcc не срабатывает SFINAE в boost::enable_if - ума не приложу. Должно все работать как часы. Не верю, что gcc не умеет в SFINAE. Ведь наверняка у меня какая-то маленькая глупая ошибка.
                      Ответить
                  • #include <iostream>
                    #include <boost/mpl/bool.hpp>
                    //#include <boost/mpl/not.hpp>
                    //#include <boost/type_traits/is_pod.hpp>
                    //#include <boost/utility/enable_if.hpp>
                    
                    using namespace std;
                    using namespace boost;
                    using namespace mpl;
                    
                    typedef char False1;
                    struct True1{False1 dummy[2];};
                    
                    template<class T> 
                    static T& makeT();
                    
                    template<class T> 
                    static True1 is_complete(T&, bool dummy=(sizeof(T)!=0));
                    
                    template<class T> 
                    static False1 is_complete(...);
                    
                    template<class T>
                    struct is_fully_complete_type: bool_<sizeof(True1)==sizeof(is_complete<T>(makeT<T>()))>{};
                    
                    struct Ko_Ko;
                    struct Ok_Ok{};
                    //struct Ga_Ga{virtual ~Ga_Ga(){};};
                    
                    int _tmain(int argc, _TCHAR* argv[])
                    {
                    	cout<<is_fully_complete_type<Ko_Ko>::value<<endl;
                    	cout<<is_fully_complete_type<Ok_Ok>::value<<endl;
                    //	cout<<is_fully_complete_type<Ga_Ga>::value<<endl;	
                    
                    	return 0;
                    }

                    Короче это делается как-то так.
                    Ответить
                    • gcc says: error: invalid application of ‘sizeof’ to incomplete type ‘Ko_Ko’

                      C++98 standard says: [5.3.3/1 Sizeof] The sizeof operator shall not be applied to an expression that has function or incomplete type, or to an enumeration type before all its enumerators have been declared, or to the parenthesized name of such types, or to an lvalue that designates a bit-field.

                      And you are using sizeof(T) in True1. So...
                      Ответить
                      • SFINAE - Substitution failure is not an error.
                        Ответить
                        • А вот я совсем не уверен, что здесь должно быть substritution failure. Здесь же ошибка в дефолтном аргументе, а не при инстанциации самого шаблона.

                          Емнип SFINAE работает только при некорректности типов, но не значений. А здесь некорректно именно значение, а тип вполне определен.
                          Ответить
                          • В sizeof(T) подставился неудачный тип. Это именно substritution failure.
                            Дифолтные аргументы часть инстанцирования самого шаблона. В бусте нечто подобное местами встречается.
                            Ответить
            • весеннее обострение?
              Ответить
    • >String из thirdparty-библиотеки
      уже одно это эпично
      Ответить

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