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

    +55

    1. 1
    2. 2
    // Извиняюсь, но кода не будет, только ссылка.
    // https://github.com/fruxo/turbobadger

    >> With compilers supporting C+ + 11
    Вот лично против либы ничего не имею - годная получилась. Но..
    Аффтар заучил nullptr, и считает что теперь он использует c++11.
    Епт, да эта либа спокойно собирается под vc2008, стоит только задефайнить nullptr как 0.

    Запостил: Pythoner, 16 Октября 2014

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

    • В описании я увидел это:
      With compilers supporting C++ 11  constexpr , the string to integer conversion is done compile time.


      Если я правильно понял, то если компилятор поддерживает C++11, куча вычислений будет проведена на этапе компиляции и код будет более эффективным. Вот же тот самый фрагмент для компиляторов с поддержкой C++11, на которых всё разрешится во время компиляции:
      #ifdef TB_SUPPORT_CONSTEXPR
      
      // FNV constants
      static constexpr uint32 basis = 2166136261U;
      static constexpr uint32 prime = 16777619U;
      
      // compile-time hash helper function
      constexpr uint32 TBGetHash_one(char c, const char* remain, uint32 value)
      {
      	return c == 0 ? value : TBGetHash_one(remain[0], remain + 1, (value ^ c) * prime);
      }
      
      // compile-time hash
      constexpr uint32 TBGetHash(const char* str)
      {
      	return (str && *str) ? TBGetHash_one(str[0], str + 1, basis) : 0;
      }
      
      #define TBIDC(str) TBGetHash(str)
      
      #else // TB_SUPPORT_CONSTEXPR
      
      #define TBIDC(str) TBID(str)
      
      /** Get hash value from string */
      uint32 TBGetHash(const char *str);
      
      #endif // !TB_SUPPORT_CONSTEXPR


      И для говна мамонта, с которым всё придётся делать в рантайме:
      #ifndef TB_SUPPORT_CONSTEXPR
      
      uint32 TBGetHash(const char *str)
      {
      	if (!str || !*str)
      		return 0;
      	// FNV hash
      	uint32 hash = 2166136261U;
      	int i = 0;
      	while (str[i])
      	{
      		char c = str[i++];
      		hash = (16777619U * hash) ^ c;
      	}
      	return hash;
      }
      
      #endif // !TB_SUPPORT_CONSTEXPR


      Надеюсь на то, что Pythoner'у будет стыдно за это.
      Ответить
      • Но при этом на говне мамонта оно не соберется. nullptr то не объявлен!
        Ответить
        • После сборки обработать напильником.
          Ответить
        • А автору об этом кто-то сообщил уже?
          А вообще обидно. Пилишь-пилишь, а потом кто-то "Где здесь C++11?"
          Ответить
          • В issues заметки об этом нет. По идее нужно отправить...
            Ответить
        • Я бы вообще не рекомендовал собирать что-нибудь на говне.
          Ответить
      • > TB_SUPPORT_CONSTEXPR
        Тарас поддерживает констэкспры.
        Ответить
        • Но ведь это выражение всегда будет !defined, поэтому одну ветку можно выкинуть. Или всё-таки есть шанс, что его значение изменится?
          Ответить
          • Не совсем понял мысль. Кстати, совсем недавно обсуждали:
            #ifndef TB_SUPPORT_CONSTEXPR
            #endif // !TB_SUPPORT_CONSTEXPR
                      ^  ~~~~~~~~~~~~
            Copy-paste detected
            Ответить
            • Будет ли TarasB в будущем поддерживать constexpr?
              Ответить
            • > Copy-paste detected

              Автор так помечает конец ветки, в которой выполнено условие.
              // !TB_SUPPORT_CONSTEXPR — конец ветки, в которой !defined(TB_SUPPORT_CONSTEXPR)

              // TB_SUPPORT_CONSTEXPR — конец ветки, в которой defined(TB_SUPPORT_CONSTEXPR)
              Ответить
              • А, понял. Это я посмотрел на первую и последнюю строку первого отрывка, а потом на первую и последнюю строку второго отрывка, а в середине толком не разбирался.
                Ответить
      • >если компилятор поддерживает C++11, куча вычислений будет проведена на этапе компиляции и код будет более эффективным.
        Чур, чур. Вот почему крестобляди такие мелочные?
        "Эффективным". Да ну нах. Преждвременная оптимизация, вот что говорил старина Кнут, о таких.
        Ничтожный выигрыш в доли процента, который никто никогда не почувствует, ибо тупит обычно совсем в другом месте (и без профайлера этого не выяснить). Сборка может идти долгие часы, но зато крестоприложение запустится на микросекунду быстрее!!! Нет, ну вы представляете?!

        Да программист больше раз пересоберёт тот код, чем пользователь почувствует какое-то замедление от расчёта хеша захаркоженой строки.
        Это я к тому почему сборки крестокодов такие меееееееедлеееенныеыыыыыыыыыееееееее.
        Ответить
        • Вдобавок С++11 constexpr функции из-за драконовских ограничений и повальной рекурсии вполне могут замедлять работу программы если их будут часто вызывать в рантайме.
          В С++14 проще: добавил constexpr перед функцией, задефайнил constexpr на пустую строку для неподдерживающих и ОК.
          Ответить
          • Т. е. в C++14 в упомянутом примере можно тупо поставить constexpr перед нерекурсивной реализацией TBGetHash и компилятор дальше сам справится?
            Ответить
          • > из-за драконовских ограничений и повальной рекурсии вполне могут замедлять работу
            Не пойму чего они вообще эти ограничения?!
            По сути совсем немножко упростили сделав ненужными шаблоны для этих делов.
            Да и код компилирующийся бесконечное время и можно было писать и до того.

            По сути крестоблядям и не только нужен отдельный метаязык времени компиляции. Где желательно еще будет управление макросами. Причем эту стадию можно вынести в совершенно разными и неожиданными способами.

            И вот тут мне приходит мысль что мы где-то уже это обсуждали. Ведь точно wvxvw, лисп и его особые стадии компиляции.
            Ответить
            • >Не пойму чего они вообще эти ограничения?!
              «ко-ко-ко разработчики компиляторов ниасилят полноценные функции». А вообще Мейерс давно говорил, что кресты по сути состоят из четырёх отдельных языков.
              Ответить
              • >А вообще Мейерс давно говорил, что кресты по сути состоят из четырёх отдельных языков.
                Я не поленился, нашёл цитату. В том-то и проблема что Майерс писал об этом давно - аж в 2005.

                Scott breaks down the c++ language into 4 subparts:

                * The old C subsystem. Before all these advanced programming languages such as Java and .NET came, C was the language of choice. C++ is "translated" to C first, and then complied and linked to an executable.

                * OO C++, which is C with Classes. This is where the concept of Object Orientation in C++ started. Even though this concept was very much new a decade ago, it is very much part of a programmer's vocabulary.

                * Template C++, which is the newest edition to the C++ standard and it brings with it the concept of Template Metaprogramming. This concept is very much new, and this book has dedicated a whole chapter around templates, and template metaprogramming.

                * STL, which is the C++ Standard Template Library. Again, STL was a new concept a few years back, but it is very much an established notion in C++

                С тех пор придумали бустятину и в моду вошла функцианальщина: лямбды, хитрые выводы типов, foreach, auto (и всё из нового стандарта о чем я еще не знаю), так что подязыков там сейчас куда больше.

                И не подумайте что я фанат лишпов, но на ум приходит правило Гриспена:
                Любой достаточно сложный язык содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp.
                Ответить
                • у меня ассоциации вендопитушка (не по теме, естественно):
                  >> А вообще M$ давно говорил, что винды по сути состоят из джвух отдельных систем.
                  > Я не поленился, нашёл цитату. В том-то и проблема что M$ писал об этом давно, а теперь обещает снова единую запилить.
                  Ответить
        • > Преждвременная оптимизация
          Абсолютно согласен.

          Хэштаблицы с виртуальными методами, зато хэши вычисляются быстро, ага.
          Ответить
      • > TBGetHash
        Taras B?


        Тьфу, выше Роман уже об этом написал. Сорри.
        Ответить
    • показать все, что скрыто-
      Ответить
    • ДАВАЙТЕ ФЛУДИТЬ И ТРОЛЛИТЬ! ;)
      Ответить

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