Сообщение Re: Placement new для инициализации примитивного типа в само от 02.10.2025 9:52
Изменено 02.10.2025 10:20 sergii.p
Re: Placement new для инициализации примитивного типа в самодельном union?
Здравствуйте, so5team, Вы писали:
в функции store_to не должно быть проблем. Могут быть проблемы с функцией read
Чтобы избежать этого нужен std::launder. Но если его вызывать при каждом чтении, то компилытор уже ничего оптимизировать не будет, что тоже не очень хорошо.
в функции store_to не должно быть проблем. Могут быть проблемы с функцией read
typename<T>
T& read(my_union_t<T>& src) {
return *(reinterpret_cast<T*>(src._content.data()));
}
struct Data { int i; };
Data data1{1};
my_union_t<Data> storage;
store_to(storage, data1);
std::cout << read(storage).i;
Data data2{2};
store_to(storage, data2);
std::cout << read(storage).i; // тут компилятор может закешировать и вернуть 1Чтобы избежать этого нужен std::launder. Но если его вызывать при каждом чтении, то компилытор уже ничего оптимизировать не будет, что тоже не очень хорошо.
Re: Placement new для инициализации примитивного типа в само
Здравствуйте, so5team, Вы писали:
в функции store_to не должно быть проблем. Могут быть проблемы с функцией read
Чтобы избежать этого нужен std::launder. Но если его вызывать при каждом чтении, то компилятор уже ничего оптимизировать не будет, что тоже не очень хорошо.
в функции store_to не должно быть проблем. Могут быть проблемы с функцией read
typename<T>
T& read(my_union_t<T>& src) {
return *(reinterpret_cast<T*>(src._content.data()));
}
struct Data { int i; };
Data data1{1};
my_union_t<Data> storage;
store_to(storage, data1);
std::cout << read(storage).i;
Data data2{2};
store_to(storage, data2);
std::cout << read(storage).i; // тут компилятор может закешировать и вернуть 1Чтобы избежать этого нужен std::launder. Но если его вызывать при каждом чтении, то компилятор уже ничего оптимизировать не будет, что тоже не очень хорошо.