Задать вопрос
@yatanai
Поклонник православного С

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

Мне интересны возможности обойти ограничение на бинарное приведение типов, ибо bit_cast использует копирование в переменную на стеке, что не особо быстро.
Но насколько я знаю, тривиальные типы не инициализируют память в дефолтных конструкторах. Значит ли это что для bit_cast'а в тривиальный тип мы можем использовать placement new с указателем на интересующую нас память и тем самым сохранить байты в памяти без изменений и избавить себя от ненужного копирования?
Есть ли какие-либо позиции стандарта по этому поводу, которые я не могу нагуглить и которые запрещают использовать мне placement new с какими-то "нетакими" указателями?

К примеру, первый вариант это то как другие используют данную фичу.
Второй же вариант это то как я хочу использовать.
#include <iostream>
using namespace std;
class Foo 
{ 
    private: int __unused; 
    public: Foo() : __unused(1) {} //Мы всёравно сохраняеем trivially_copyable, так что всё хорошо
};

int main()
{
    //char bytes[1024];
    //auto* foo = new(bytes) Foo;
    
    Foo bytes{};
    auto* foo = new(&bytes) int;
    
    cout << *foo;
    return 0;
}
  • Вопрос задан
  • 87 просмотров
Подписаться 2 Простой 6 комментариев
Пригласить эксперта
Ответы на вопрос 1
mindtester
@mindtester
http://iczin.su/hexagram_48
Мне интересны возможности обойти ограничение на бинарное приведение типов, ибо bit_cast использует копирование в переменную на стеке, что не особо быстро.
хрень лысая. операции на стеке одни из самых быстрых..
.. если они порождают проблемы, это проблемы в логике кода
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы