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

    +3

    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
    /*
    =============
    TempVector
    
    This is just a convenience function
    for making temporary vectors for function calls
    =============
    */
    float  *tv (float x, float y, float z)
    {
      static  int    index;
      static  vec3_t  vecs[8];
      float  *v;
    
      // use an array so that multiple tempvectors won't collide
      // for a while
      v = vecs[index];
      index = (index + 1)&7;
    
      v[0] = x;
      v[1] = y;
      v[2] = z;
    
      return v;
    }

    Запостил: LispGovno, 13 Сентября 2015

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

    • Not bad :-/
      Ответить
    • Но почему не запилить этот временный вектор тупо на стеке?
      Ответить
      • А вектор это что? Там же все равно ссылки на элементы, где они будут?
        Ответить
        • > А вектор это что?
          Хер знает. Какой-то vec3_t из их проекта. Скорее всего просто структурка/класс с тремя полями.
          Ответить
          • Там ссылки или сишный struct?
            Ответить
            • Ну, судя по обращению, я ошибся немного. Судя по 20-21 и 9,24 там что-то такое:
              typedef float vec3_t[3];
              Т.е. никаких ссылок, структур или классов. Просто массив из 3 элементов.

              P.S. Ну либо класс с перегруженными операторами [] и (float*). Хуй знает :(
              Ответить
      • Так если на стеке внутри функции, то ведь умрет раньше времени. А тут round-robin сборщик мусора

        Я за
        thread_local static vec3_t  vecs[100500]; //100500 хватит всем.
        Ответить
        • > умрет раньше времени
          Раньше какого времени? RVO спасёт отца русской демократии?
          Для чего вообще используется эта функция?
          Ответить
          • Ты сначала научись возвращать массивы из функций для RVO без хаков типа заворачивания в структуру.
            Ответить
            • А почему нельзя завернуть в структуру?
              Ответить
              • Ни один царь не верит в RVO и NRVO
                Ответить
                • // хуй знает, сработает или нет
                  some_struct foo();
                  
                  // поэтому настоящий царь делает RVO сам
                  void foo(some_struct & out);
                  Ответить
                  • Ну ты сам то понимаешь, что это не удобно. А тут гарантированное царское рво
                    Ответить
      • Потому что tv(*tv(1,2,3), *tv(4,5,6), 0) тогда упадёт
        Ответить
    • потокобезопасно, очевидно и масштабируемо
      Ответить
    • Это не сиплюсплюс, это чистый C!
      Ответить
    • Название функции просто оффигенное, автор думает что люди телепаты.
      Так же с переменными
      Ответить
    • Автор разместил это код только потому что не понял его?
      Ответить
      • Как минимум потому что индекс не инициализирован. Да и вообще идея не из лучших.
        Ответить
        • Похоже посоны не знают, что глобальные и статические переменные инициализируются нулём.
          Идея чего? Ты в алгоритм то вникал?
          Ответить
          • Вообще правильно говорить так: "переменные со storage duration == static инициализируются нулём". А какой у них скоп (функция или нет) уже не важно.
            Ответить
            • Да, static storage duration. Просто не все знают что это такое.
              Ответить
          • > Идея чего? Ты в алгоритм то вникал?
            Идея round-robin'ом выделять память под временные вектора. А потом молиться, чтобы код нигде не удержал этот указатель чуть-чуть дольше, чем надо. И чтобы не поюзал больше слотов, чем надо. Проверок то никаких.

            > глобальные и статические переменные инициализируются нулём
            Ок, затупил.
            Ответить
          • А самый лол в том, что это кручу-верчу-запутать хочу связывает руки оптимизатору. И код из топика поди работает медленней, чем тупое
            struct vec3_t {
                float x, y, z;
                vec3_t(float x, float y, float z) : x(x), y(y), z(z) {}
            };
            vec3_t res = some_func(vec3_t(0, 0, 0), vec3_t(1, 1, 1));
            Ответить
            • Это (код в топике), конечно, наверняка не самое лучшее решение нужной проблемы, но ведь там и написано: "This is just a convenience function".
              И судить о нём, не зная как он применяется, не вижу смысла.
              Ответить
              • > не зная как он применяется
                >> for making temporary vectors for function calls
                146%, что как-то так:
                vec3_t * some_func(const vec3_t * a, const vec3_t * b) {
                    return tv(a[0] + b[0], a[1] + b[1], a[2] + c[2]);
                }
                vec3_t * res = some_func(tv(0, 0, 0), tv(1, 1, 1));
                Ответить

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