• Как хранится c++ struct в памяти и как определить размер вручную?

    @yatanai
    Поклонник православного С
    sizeof возвращает тебе размер в байтах, которые могут иметь разную разрядность на разных платформах, но в основном 8. Потому это надёжный способ определять какой реальный объём занимает структура.
    struct pack
    {
        short x;
        int y;
        short z;
    };
    //...
    auto size = sizeof(pack) //вернёт 12 байт на AMD64


    Выравнивание переменных можно изменить используя РАЗНЫЕ ключевые слова, такие как alignas или #pragma pack(). Первое поможет выравнять данные по большей границе чем есть на самом деле, а второе наоборот.
    #pragma pack(push, 1)
    struct pack
    {
        short x;
        int y;
        short z;
    };
    #pragma pack(pop)
    struct pack2
    {
        alignas(16) short x;
        alignas(16) int y;
        short z;
    };
    //...
    auto size = sizeof(pack) //вернёт 8 байт
    auto size = sizeof(pack2) //вернёт 32 байта


    Гугление паков и алигментов объяснит тебе тонкости более подробно
    Ответ написан
    Комментировать
  • Как реализовать шаблонный оператор\функцию, чтобы скрыть < и > символы после объявления?

    @yatanai Автор вопроса
    Поклонник православного С
    В итоге я сам нашёл себе ответ - введение промежуточного класса для кастов в другие типы.

    На счёт эффективности его работы я не ручаюсь, но в целом может решить мой вопрос.
    Код ниже компилируется в онлайн компиляторах и выводит то что нужно.
    #include <iostream>
    
    using namespace std;
    
    class foo 
    { 
    public: 
        void* ptr; 
        int n; 
        
        template<class T>
        operator T() 
        {
            T* x = static_cast<T*>(this->ptr);
            T z = x[this->n] ;
            return z;
        }
    };
    
    class mem_t
    {
    public:
        void* ptr;
        size_t size;
        
        mem_t(void* p, size_t s) : ptr(p), size(s) {}
        
        foo at(size_t n)
        {
            foo ret;
            ret.ptr = this->ptr;
            ret.n = n;
            return ret;
        }
    };
    
    int main()
    {
        cout<<"5 is : ";
        
        auto num = new int[10];
        num[5] = 3;// Проверяем вывод
        
        mem_t m ((void*)num, 10u);
        int a = m.at(5);
        std::cout << a << endl;
        
        return 0;
    }
    //5 is : 3


    Может можно сделать так что бы компилятор справлялся "оптимизируя" такое, но там нужно более углублённые знания в то как работают ссылки\переменные в крестах, чего у меня нет.

    PS - Код не вылизанный, я просто писал что бы работало
    PSS - Ржу, компилятор смог это оптимизировать. Победа получается?
    Ответ написан
    Комментировать
  • Как изменить оси вращения в кватернионе?

    @yatanai Автор вопроса
    Поклонник православного С
    Неожиданно, когда я решил побаловаться перестановками переменных в своём коде, всё решилось.
    В моём случае достаточно было поменять компоненты W и X местами, и после инвертировать X. (У меня оно вращалось в обратную сторону)
    Тоесть в итоге я сделал (w, x, y, z) ->(x, -w, y, z)
    Так же я гуглил чужой код и нашёл другую перестановку (w, x, y, z) ->(-y, x, z, w), но в моём случае она не дала нужных осей.
    Некоторые перестановки полностью ломают движок и пространство начинает схлопываться, так что осторожнее
    Ответ написан
    Комментировать
  • Головоломки помогают айтишникам улучшить мышление?

    @yatanai
    Поклонник православного С
    Помогут ли головомойки? Нет. Если они с АДОВЫМ уровнем сложности для тебя? То возможно да. Если ты будешь решать типичные задачи которые можно решить если просто подумать, то толку от этого нет. Это больше походит на гимнастику. Размял моск и дальше с ясностью ума. Но если решать задачи за граней твоего понимания, это поможет немного "расширить" твои возможности при решении задач.

    Как не очень хороший но простой пример, сможешь ли ты пройти сокобан? Вроде сложно, но решаемо, да? А если там будет огромная карта на +1К ходов и всего с одним верным решением?
    Ответ написан
  • Как реализовать GPU на ПЛИС?

    @yatanai
    Поклонник православного С
    поздновато но... Смотря что вы подразумеваете под GPU. Если смотреть в историю, то все 3D акселераторы и прочее связанное с графикой это простые ядра с минимальным набором команд нужных только для определённых задач (а иногда даже "популярные" RISC ядра с FPU). В процессе эволюции сам смысл GPU как параллельной числодробилки особо не изменился. Это, разбитые на кластеры, группы ядер с простой системой команд, и очень малой памятью программ(256 команд как прим). У каждого кластера есть свои спец блоки (прим*Блоки растеризации), чтоб ускорить процессы "формирования" изображения, или всяких карт.
    Если мы говорим про то, что нужно знать чтоб делать GPU как 3D рисовалку, то надо знать как строится изображения графическими библиотеками. (хотябы)
    Мне помогли статьи на хабре про CPU рендере якимто профессором. Как это выглядело "снаружи"

    Это всё что нужно знать о GPU а дальнейшая реализация уже на вашей фантазии. И поверьте, вариантов как сделать это просто тьма.

    А проблемы с FPGA только в производительности, ибо на простеньком EP4CE22 в F24 я выжимал 1-2Gflops c 10ядерным 2х(4+1). А ещё нужна достаточно быстрая оперативка. SDR SDRAM даже для 800х600 слабо подходит. Скорее только уж треугольники в картинку превращать. Тут надо бы DDR* 400 (или выше если запустится)
    PS- Мои ядра были не векторные если шо
    Ответ написан
    3 комментария