Задать вопрос
Ответы пользователя по тегу C++
  • Как написать игровой движок?

    @yatanai
    Поклонник православного С
    Если абстрагироваться от всех этих понятий, то движок это некий код который позволяет кастомизировать поведение программы.
    Если мы говорим об играх, то движок не всегда и нужен. По сути основная база игры это сама игра, которую можно реализовать банальным хардкодом. Тебе придётся изучить базовые понятия по игровой симуляции чтобы сделать это, и некоторые которые дополнительные фичи которые зависят от жанра. (Типо как считать движение пули)
    А писать именно движок это муторное и сложное дело, неподходящее занятие для начинающих. Смотри то как раньше делали игры, на сегу никто движки не писал, они появились гораздо позже.
    Ответ написан
    Комментировать
  • Как хранится 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 - Ржу, компилятор смог это оптимизировать. Победа получается?
    Ответ написан
    Комментировать