среда, 25 мая 2022 г.

[prog.c++] В склерозник: ссылки на тему std::launder

В процессе копания темы передачи C++ объектов через разделяемую память возникли подозрения, что где-то мы с placement new работаем не корректно. Пришлось погрузиться в изучение std::launder.

Все, что связано с std::launder для меня какая-то мутная тема, с которой никогда толком не связывался. А тут пришлось. И выяснилось, что толковой информации не так, чтобы много.

Поэтому решил зафиксировать несколько полезных ссылок дабы их затем проще было найти. Может быть еще кому-то эта информация будет полезна. Итак, вот что толкового пока удалось нарыть:

Если нарою что-то еще, то дополню список.

Очень часто несведующие, а то и просто праздо шатающие по ОйТи люди, интересуются, а с чегой-то C++ такой сложный.

А с тогой-то, что C++ применяют люди, которых жизнь заставляет писать что-то подобное:

void *operator new(size_t, void *p) { return p; }

struct A {
  virtual int f();
};

struct B : A {
  virtual int f() { new (this) A; return 1; }
};

int A::f() { new (this) B; return 2; }

int h() {
  A a;
  int n = a.f();
  int m = std::launder(&a)->f();
  return n + m;
}

Не буду вдаваться в обсуждение того, хорошо ли это или же мы тут имеем дело с лютым говнокодом. Но раз кому-то потребовалось, то язык это должен поддержать, что и сказывается на сложности этого самого языка. Как говорится, не мы такие, жизнь такая...

Комментариев нет: