Информация об изменениях

Сообщение Re: Placement new для инициализации примитивного типа в само от 02.10.2025 9:52

Изменено 02.10.2025 10:20 sergii.p

Re: Placement new для инициализации примитивного типа в самодельном union?
Здравствуйте, so5team, Вы писали:

в функции 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

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. Но если его вызывать при каждом чтении, то компилятор уже ничего оптимизировать не будет, что тоже не очень хорошо.