1. Си / Говнокод #19383

    −50

    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
    #define OP(a,b,op) ((a)op(b))
    
    #define MKFUNC_a_op_b(type, opname, op) void type##_##opname##_##type(const void *a, const void *b, void *out) \
    {\
      type tmp =  OP(*(type*)a,*(type*)b,op);\
      memcpy(out,(void*)(&tmp),sizeof(type));\
    }
    
    #define MKALLF_int(type) \
    MKFUNC_a_op_b(type,plus,+) MKFUNC_a_op_b(type,minus,-) \
    MKFUNC_a_op_b(type,div,/) MKFUNC_a_op_b(type,mod,%) \
    MKFUNC_a_op_b(type,and,&) MKFUNC_a_op_b(type,or,|) \
    MKFUNC_a_op_b(type,xor,^)
    
    MKALLF_int(int8_t)
    MKALLF_int(uint8_t)
    MKALLF_int(int16_t)
    MKALLF_int(uint16_t)
    MKALLF_int(int32_t)
    MKALLF_int(uint32_t)
    MKALLF_int(int64_t)
    MKALLF_int(uint64_t)
    
    #define MKFUNC_conv_t(type1, type2) void type1##_to_##type2(const void *a, void *out) \
    {\
      type2 tmp = (type2)(*(type1*)a);\
      memcpy(out,(void*)(&tmp),sizeof(type2));\
    }
    
    #define MKFUNC_con_M(type) \
    MKFUNC_conv_t(type, int8_t) \
    MKFUNC_conv_t(type, uint8_t) \
    MKFUNC_conv_t(type, int16_t) \
    MKFUNC_conv_t(type, uint16_t) \
    MKFUNC_conv_t(type, int32_t) \
    MKFUNC_conv_t(type, uint32_t) \
    MKFUNC_conv_t(type, int64_t) \
    MKFUNC_conv_t(type, uint64_t)
    
    MKFUNC_con_M(int8_t)
    MKFUNC_con_M(uint8_t)
    MKFUNC_con_M(int16_t)
    MKFUNC_con_M(uint16_t)
    MKFUNC_con_M(int32_t)
    MKFUNC_con_M(uint32_t)
    MKFUNC_con_M(int64_t)
    MKFUNC_con_M(uint64_t)

    Это я типа такую заготовку для стековой ВМ делаю, определяю операции(инструкции) для опкодов кагбэ. Потом у меня там будет массив указателей на функции, ну и я их буду вызывать, пропихивая аргументы. Но похоже что сишный препроцессор это говно полное, и надо кодогеренератор для набора такой ерунды делать.

    Запостил: j123123, 02 Февраля 2016

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

    • https://www.linux.org.ru/forum/development/12314211/page2?lastmod=1454402517780#comment-12322285 тем временем на ЛОРе обнаружена активность Царя, и я ему пытаюсь доказать говнистость сишного препроцессора этим примером
      Ответить
      • --------------------------> промах
        _______
        / \
        | кеш |
        \_______/
        Ответить
        • У вас кеш сломался. Мимо такого кеша действительно лучше промахнуться
          Ответить
      • я аж прослезился от приступа ностальгии. Когда был мелким звездюном тоже пытался кого-то убедить в интернете что они ничтожества.
        Ответить
      • Инлайн и анрол - это два столпа на которых стоит производительность в текущем мире.

        В идеальной программе заинлайнены все функции и заанроллены все циклы.
        Ответить
        • И рекурсия, рекурсия тоже заанролена
          Ответить
          • > рекурсия тоже заанролена
            В царских программах нету анскильной рекурсии, они работают за O(1/N).
            Ответить
            • > за O(1/N)
              Данные обрабатывают себя и своих соседей. Чем больше данных - тем быстрее.
              Ответить
              • Не соседей, а вообще всех остальных. Иначе O(1/N) не получится.
                Ответить
                • Теперь понятно, почему при установке Винды больше всего времени занимает операция «поиск свободного места на диске».
                  Ответить
            • > O(1/n)

              The copy function behaves as if it had O(1/n) complexity on the copy . add composition.

              https://medium.com/@maiavictor/some-functions-may-have-negative-complexity-im-worried-for-my-crypto-c53f6e7343d3


              WUT?!
              Ответить
              • Ну чел же сам пишет: it just a silly analogy.
                Ответить
              • З.Ы. Ну и, судя по второй статье, никакой магии там нет. Просто редукции удачно легли, позволяя отбросить бесполезную работу, и вместо наивного O(n) функция add стала работать за ожидаемые от неё O(log(N)).
                Ответить
                • > никакой магии там нет

                  Да это понятно. Просто сам факт контринтуитивен.
                  Ответить
              • Error 1020
                Ответить
    • Зачем тебе вообще вся эта мелочь в стековой машине? Вон в джаве только слово (4 байта) и двойное слово (8 байт) оставили...
      Ответить
      • Это я просто хочу сделать стековую машину с таким байткодом, в который бы легко компилировалась сишка, и все базовые сишковые типы всех возможных размеров хочу туда всунуть
        Ответить
        • А сишка не умеет же в эти типы :) Там даже по стандарту, емнип, на время вычислений всё апкастится до размера слова а потом обрезается... Так что можно с чистой совестью хранить всё как слова и не париться.
          Ответить

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