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

    +20

    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
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    #include <iostream>
    #include <cstring>
    
    const char tag[] = "Secret tag!";
    const size_t tagSize = sizeof(tag);
    const size_t nameSize = 32;
    
    template<class T>
    struct Value
    {
        Value(const char* name, const T& data) :
    data(data)
    {
        std::strncpy(this->tag, ::tag, tagSize);
        std::strncpy(this->name, name, nameSize);
    }
    char tag[tagSize];
    char name[nameSize];
    T data;
    };
    
    int getStackDir()
    {
        char a;
        char b;
        return &b > &a ? 1 : -1;
    }
    
    template<class T>
    T getValue(const char* name)
    {
        static const size_t stackSize = 1024 * 1024;
        const int stackDir = getStackDir();
        char begin;
        for(char* p = &begin, *end = &begin - stackSize * stackDir; p != end; p -= stackDir)
        {
            Value<T>* value = (Value<T>*)p;
            if(std::strcmp(value->tag, tag) != 0) continue;
            if(std::strcmp(value->name, name) != 0) continue;
            return value->data;
        }
        return T();
    }
    
    #define SET(type, name, value) Value<type> name(#name, value)
    #define GET(type, name) getValue<type>(#name)
    
    //-----------------------------------------------------------
    
    void test()
    {
        std::cout << GET(int, x) << std::endl;
    }
    
    int main()
    {
        SET(int, x, 13);
        test();
    }

    Отсюда http://www.rsdn.ru/forum/cpp/5163916.flat#5163916

    Запостил: Artur, 13 Мая 2013

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

    • Мне на ум приходят только два слова.
      Ёбаный. Пиздец.
      Ответить
      • кресто*шаблоны<всегда>(выглядят)=как_еба ный&пиздец
        Ответить
        • Да член с ними, с шаблонами! У меня шерсть дыбом от способа получения направления роста стека и "прогулки" вниз по нему. Умом-то я понимаю, что технически это возможно, но не хочу, чтобы кто-либо когда-либо подобное делал. Пойду я, порыдаю.
          Ответить
          • Лучше уж ассемблерная вставка, чем такое ;) Я кстати так и не понял, что оно делает со стеком... Что-то такое упихивает поверх begin'а и лежащих далее переменных...

            P.S. Если они хотят просто стек значений для какой-то переменной, то почему бы просто не сохранять его в RAIIшной переменной, а в ее деструкторе откатывать назад?

            P.P.S. Ну или мапу из линкед листов или стеков, раз уж по именам доступ... Наверное старею я, раз мне подобные подходы уже не по душе, и хочется чего-то простого и понятного...
            Ответить
          • А все, понял. Он ищет в ближайшем мегабайте стека подходящую структурку Value по тегу и ее имени... А dir определяется согласно архитектуре (смотря в какую сторону на най растет стек)...

            P.S. Очень, очень, очень хрупкий код. Мне страшно представить, что будет, если компилятор переставит местами a и b (вроде бы ничего ему не мешает это сделать), или на стеке не будет подходящего value, и оно с шумом пролетающего паровоза улетит за границы стека...

            P.P.S. И подобный идиотизм ведь отлично заменяется линкед листом из стековых структур...
            Ответить
            • Хм. Полистал я ссылку, вроде все встало на свои места: это ж очевидный лолкод, даже в чем-то забавный, хе-хе.

              P.S.
              >>Я кстати так и не понял, что оно делает со стеком...
              >>Наверное старею я
              bormand скро-омничает, мимими :)
              Ответить
              • А вот кстати, проблема не такая уж тривиальная, если задуматься о тредах... Из-за потокобезопасности нельзя менять ни значения переменной, ни какой-либо ссылки в ней, поэтому в голову приходит только какой-нибудь TLS.
                Ответить
          • А вообще, видимо, корни проблемы растут из таких языков как LISP, в которых есть динамическая область видимости, а не только лексическая...
            Ответить
            • Лисп говно же!
              Ответить
              • > Лисп говно же!
                Да ну? Аргументируйте.
                Ответить
                • > Аргументируйте.
                  Слышу тролля.
                  Ответить
                  • > Слышу тролля.
                    Презумпция невиновности же. Хочешь сказать, что язык говно - изволь доказывать это сам. А начинать оправдывать лисп мне пока рано, т.к. оппонент не предъявил никакой аргументации, с которой было бы интересно поспорить.
                    Ответить
                    • > Хочешь сказать, что язык говно - изволь доказывать это сам.
                      Мне лень говорить, поэтому не хочу.
                      Ответить
                  • >тролля
                    Это деепричастие?
                    Ответить
    • Не, ну а че:
      #include <iostream>
      using namespace std;
       
      int someVar = 2;
       
      int main() {
       
          cout << someVar << "\n";
          {
              int someVar = ::someVar;
              someVar += 4;
              cout << someVar << "\n";
          }
          cout << someVar << "\n";
              
          return 0;
      }

      http://ideone.com/lhMlV8
      Ну это если внутри других функций переменную не трогать
      Ответить
      • Ну суть динамической области видимости не совсем в этом. Там надо, чтобы новое значение переменной видели все функции, вызванные из текущей (но не соседние треды, и не функции выше по стеку).
        Ответить

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