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

    0

    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
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    #include <type_traits>
    
    struct TPred1 {};
    struct TPred2 {};
    template<typename P1, typename P2> struct TAnd1: P1, P2 {TAnd1(P1, P2) {}};
    template<typename P1, typename P2> struct TAnd2: P1, P2 {TAnd2(P1, P2) {}};
    
    template<typename T, T v> struct my_integral_constant {enum {value=v};};
    template<class T, class From> struct my_is_base_of:
      my_integral_constant<bool, __is_base_of(T, From)> {};
    
    template<typename P1, typename P2> std::enable_if_t<
      my_is_base_of<TPred1, P1>::value &&
      my_is_base_of<TPred1, P2>::value,
    TAnd1<P1, P2>> operator&&(P1 p1, P2 p2)
    {return {p1, p2};}
    
    template<typename P1, typename P2> std::enable_if_t<
      my_is_base_of<TPred2, P1>::value &&
      my_is_base_of<TPred2, P2>::value,
    TAnd2<P1, P2>> operator&&(P1 p1, P2 p2)
    {return {(p1, p2};}
    
    
    template<typename T> struct is_callable
    {
      template<typename T1> struct dummy;
      template<typename CheckType> static short check(dummy<decltype(
        std::declval<std::remove_reference_t<CheckType>>()())>*);
      template<typename CheckType> static char check(...);
      enum: bool {value = sizeof(check<T>(nullptr)) == sizeof(short)};
    };
    
    struct IntellisenseKiller
    {
      template<typename T, typename = std::enable_if_t<
        std::is_function<T>::value &&
        is_callable<T>::value
      >> IntellisenseKiller(const T&) {}
      IntellisenseKiller(bool) {}
    };
    IntellisenseKiller eat4GbRam = true;

    Обнаружился ещё один способ превратить Visual Studio 2017 в тормозной, пожирающий 4 ГБ оперативы, блокнот с подсветкой синтаксиса.
    Это минимальный пример, который я выделил из своей библиотеки и порезал всё, что не вызывает баг. Вроде бы не связанные между собой куски кода, но глюки студии вызывают только вместе. Целый день потратил на поиск причины глюка.
    Случайно обнаружил, что длина получившегося фрагмента кода 42 строки. Я не подгонял, честно. Так что можно сказать, что ошибка в 42 строке. Без этой строки Intellisense заработает.

    Запостил: gammaker, 12 Июля 2017

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

    • То ли дело Vim GNU Emacs
      Ответить
      • > То ли дело GNU Emacs

        Вот именно, там из коробки даже посветка долбанутого C++ синтаксиса толком не работает, не то что "Intellisense".
        Зато быстро.
        Ответить
        • http://www.sql.ru/forum/466654-3/s?mid=4576680#4576680

          > Ну а уж за дурацкий синтаксис C++ вообще Страусу отдельное огромное спасибо. Мало других таких языков, для которых парсер написать - это подвиг, достойный прижизненного конного памятника в полный рост.
          Ответить
    • Интелисенс и студия не нужны. То ли дело Github Atom - там "пожирающий 4 ГБ оперативы, блокнот с подсветкой синтаксиса" из коробки, ничего делать не надо.
      Ответить
      • Оплодотворил тебя, проверь.
        Ответить
      • Это еще хорошо, что вижуалстудия только 32-битая есть. Была бы она 64-битной, могла бы и больше 4гб выжрать.
        https://www.infoq.com/news/2016/01/VS-64-bit
        https://blogs.msdn.microsoft.com/ricom/2015/12/29/revisiting-64-bit-ness-in-visual-studio-and-elsewhere/

        У Github Atom уже нет таких архитектурных ограничений, и выжрать он может побольше
        Ответить
        • Машины с адресацией шире 32 бит не нужны. В Микрософте не могут ошибаться. Продавцы нас обманули, когда пытались впарить 64-битные компы...
          Ответить

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