Задать вопрос
  • Можно ли использовать placement new как замену bit_cast?

    @yatanai Автор вопроса
    Я некорректно выражался, но в целом вместо спора надо читать документики -> https://en.cppreference.com/w/cpp/language/reinter...

    Из чего следует что в целом reinterpret_cast не нужен ни для чего кроме конвертаций указатель<->число и каста указателей в char*. В остальном же это UB + какие-то компиляторы позволяют безопасно кастить в void* и приводить указатели к другому типу, но тут уже начинаются приколы с псевдонимами типов, который используется оптимизатором + если использовать преобразованные указатели\ссылки то опять всё падает в UB.

    Мир С++ полон жути(
    Написано
  • Можно ли использовать placement new как замену bit_cast?

    @yatanai Автор вопроса
    maaGames, Как раз reinterpret_cast пользоваться во многих случаях нельзя. Почитайте про type alias в С++. Тут проблема именно в типобезопасности выражений. Ты можешь использовать reinterpret_cast для конвертации целых чисел, но, условно, поменять указатель с int* на long* таким методом нельзя и ты нарушаешь стандарт. Эта проблема приводит к тому, что ты даже не можешь пользоваться union, потому что с точки зрения стандарта, ты можешь использовать только один тип объединения и если ты напишешь как ниже, то ты нарушишь стандарт.
    union type { int x; long y; } var;
    var.x = 1;
    std::cout << var.y;

    Для таких вещей и придумали bit_cast, теперь чтобы не нарушать стандарт тебе придётся писать условно как-то так
    union type { int x; long y; } var;
    var.x = 1;
    std::cout << bit_cast<long>(var.x);


    И тут у меня возникли вопросы к релизации bit_cast. Ведь я помню что существует ровно похожая конструкция, где мы можем инициализировать объект через чужую память, при этом имеея ровно те же ограничения что и вариант реализованный в стандарте. Мы так же создаём неинициализированную переменную и так же используем чужую память. Разница лишь в том, что bit_cast создаёт новый объект с копией памяти нашего объекта, а placement new создаёт новый объект как ссылку на уже существующий.
  • Можно ли использовать placement new как замену bit_cast?

    @yatanai Автор вопроса
    maaGames, с точки зрения С++ делать вот так нельзя: int32_t x; reinterpret_cast<float*>(&x); Почему? Потому что это не типобезопасно. Поэтому в стандарт ввели bit_cast. Когда вместо приведения, ты просто копируешь память. Внутри оно устроено как-то так
    template<class To, class From>
    To bit_cast(const From& src) noexcept
    {
        static_assert(std::is_trivially_constructible_v<To>,
            "This implementation additionally requires "
            "destination type to be trivially constructible");
     
        To dst;
        std::memcpy(&dst, &src, sizeof(To));
        return dst;
    }

    Надежда вся на комппилятор, что он сможет оптимизировать вызов и заменить копирование на нужные инструкции в процессорее.

    Всё ради типобезопасности. Но можешь быть спокоен, всем на это давно пофиг. Огромное количество кода используют всякиее "небезопасные" вещи с точки зрения стандарта, потому если это решат пофиксить мир рухнет.
  • Почему множественный вызов конструктора создаёт только один объект?

    @yatanai Автор вопроса
    Wataru, Я пользуюсь msvc, и ни при каких флагах компиляции поведение не изменяется.
  • Как определить тип функции для шаблона?

    @yatanai Автор вопроса
    Мирон, Лучше поздно чем никогда.
    Моя цель была - написать реализацию свойств из C#. Что бы хотя бы вызовы свойства в коде выглядели идентично. Цели оно достигло, и в целом это стало удобно.

    А как я это применял...
    Допустим, у вас есть микроконтроллер который управляет неким устройством на шине, вам надо получить информацию о свойстве, допустим "скорость". В итоге ваш код бы превратился в это.
    int n1 = dev.GetSpeed();
    int result = dev.SetSpeed(arg);
    int fun = dev.GetSpeed() + arg * dev.GetSome();

    Или же можно сделать то что я писал, наколдовать в свойствах и получить в рабочем коде это.
    int n1 = dev.speed;
    dev.speed = arg;
    int fun = dev.speed + arg * dev.some;

    Так как работа с устройствами это по сути библиотеки (один раз написал и забыл), то после определения всех свойств, ты к ним больше не вернёшься + код уменьшается раза в 1.5.
  • Как реализовать шаблонный оператор\функцию, чтобы скрыть < и > символы после объявления?

    @yatanai Автор вопроса
    Евгений Шатунов, То есть как я понял, оно не умеет так как я хочу.
    И единственный вариант сделать это, написать что-то следующее
    template<class T>
    class Foo
    {
        T at(int sz);   //Первый вариант 
        
        template<class U>
        U at(U sz);     //Второй вариант
    }

    В остальных случаях тип который мы хотим получить от функции\метода надо объявлять явно. Как я написал в вопросе
    int b = m.at<int>(5);

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

    @yatanai Автор вопроса
    kamenyuga, меня интересует сама возможность сделать так как я написал, так как чисто технически, компилятор сам определяет какие типы требуются в выражении.

    По сути у меня "примерно таким" способом выделяются куски памяти, и можно было бы написать "адаптеры" которые бы конвертировали класс "сырой памяти" в mem< some_class >. Но меня просто заинтересовала идея, можно ли передавать сам класс "сырой памяти" и уже на основе шаблонов вытаскивать нужные тебе данные. В производительности такое решение не особо теряет, так что не вижу смысла не попробовать. Но как сделать - компетенции не хватает.
  • Можно мне книг по шаблонному программированию в С++?

    @yatanai Автор вопроса
    Читать чужой код интересно, но почему и как именно тебе никто не объяснит. Надо что-то с буквами
  • Как определить тип функции для шаблона?

    @yatanai Автор вопроса
    Направление мысли правильное, но если просто так писать то сыпет ошибками.
    Перед определением C::value_type нужно дописывать typename как тут.
    template<class C>
    class property : public C
    {
    public:
        property& operator= (typename C::type arg)
        {
            this->Setter(arg);
            return *this;
        }
        operator typename C::type()
        {
            return this->Getter();
        }
    };

    Тогда и правда всё работает, спасибо.

    Книжек по приёмам в шаблонах не подскажешь?
    (На вопрос зачем я это вообще делал - Уменьшает количество SetOffsetX\Y\Z\W в коде, теперь у тебя просто переменные)
  • Головоломки помогают айтишникам улучшить мышление?

    @yatanai
    Adamos, Та мне просто интересно что вы так на граммар токсика походите.
    Я не читал такое, мне родители только энциклопедии дарили, а я и не против особо. Это было по интересней.
  • Головоломки помогают айтишникам улучшить мышление?

    @yatanai
    Adamos
    Если человек много читал - у него поневоле формируется нормальный язык общения.
    А если он читал только техническую литературу и не разу не читал художественной? Так не сформируется "нормальный язык общения". (Под технической в основном имею ввиду различную документацию)
  • Головоломки помогают айтишникам улучшить мышление?

    @yatanai
    Считаете что признаки "хорошего интеллекта" должны всегда обладать хорошими знаниями языка и ясностью мысли? Мол и задачи качественно решать и общаться нормально?
  • Как написать компилятор С для "самодельного" процессора?

    @yatanai Автор вопроса
    Написал же, самодельный он. Ээээ, ладно.
    Как для меня, это некий мутант VLIW\CISC\RISC идей. Именно - возможность ручной группировки команд для параллельного исполнения и аж 64регистра\ Местами, сложное кодирование самих команд\ Фиксированные по размеру команды и их общие методы кодирования(опкод\функци\команды типа r3\r2...).
    Сложное это когда один опкод\функция кодирует 5-6команд. (Блок работы с памятью и регистрами). Ибо делать для каждой команды новую функцию расточительно если они по принципу работы не особо отличаются и не много требуют, хотя арифметика у меня так и сделана...(Ветвления и переходы тоже в одну функцию запиханы)

    ЗЫ 64 регистра это жесть просто! Никогда не думал что буду запихивать во все регистры константы только потому, что у меня нечем их заполнить! (В самом сложно сценарии было около 20+ рег. а всё остальное забито константами!) А потом ещё реализовал ручное переключение банокв рег. (8шт) и тут я понял что перестарался :D
    А ещё FPGA не даёт нормально сделать много портов в регистровом файле вариант с [4\1]\1 - чтение\запись уже прилично таки хавает
  • Как реализовать GPU на ПЛИС?

    @yatanai
    Вам нужен прямой мануал с уже готовой архитектурой? Такое почти не найти :D

    А как самопал на коленке...
    Можно придумать использовать тот же MIPS со всеми SIMD и FPU как GPU, которым управляет другой MIPS.(Архитектура не так важна)
    Тогда проблема в программной модели, да? Просто используйте часть адресов чтоб загружать туда микропрограммы...

    Взаимодействие GPU\CPU... У меня было так
    -CPU через область в ОЗУ указывала адрес с которого читать микропрограмму
    -Вызывалось типа "прерывания" и передавало "аргумент" которым была команда загрузки типа (Команда+номер ядра)
    -Потом ждал пока через прерывание мне вернёт что загрузка законченна
    -Вызывал "прерывание" на запуск ядер
    -Если всё законченно то потом так же через "прерывания" получал инфу об этом (И ядра автоматом отключались)

    Как по мне потом гемор делать нормальное распределение канала ОЗУ
    Ибо у меня CPU, GPU и VGA контроллер на одной шине сидели, и всем всё надо... Но свои "православные" ~~25фпс я получил. :D
  • Как написать компилятор С для "самодельного" процессора?

    @yatanai Автор вопроса
    Так асм есть, я ща докуриваю что кинули выше. Я видимо слишком неясно написал... Мне нужно было без сильной переделки компилятора выдавать код для моего проца. А потом уже на этом собрать сам компилятор.

    **Не сразу доходит как правильней надо написать вопрос** />_<\

    PS- Просто у самого асма куча суффиксов которые меняются от "типа" команды (Арифметика, Загрузка\Запись и прч) и всё это писать сложно. Нада какой нить язык шоб не думоть. Были идеи свой делать, но идея что на С уже всё написано... не даёт покоя.
  • Как написать компилятор С для "самодельного" процессора?

    @yatanai Автор вопроса
    Опа... Да, это ближе к тому что мне надо. Спасибо